Próbuję uzyskać UpdateModel do zapełnienia modelu, który jest ustawiony jako tylko interfejs podczas kompilacji. Na przykład, miećASP.NET MVC UpdateModel z interfejsem
// View Model
public class AccountViewModel {
public string Email { get; set; }
public IProfile Profile { get; set; }
}
// Interface
public interface IProfile {
// Empty
}
// Actual profile instance used
public class StandardProfile : IProfile {
public string FavoriteFood { get; set; }
public string FavoriteMusic { get; set; }
}
// Controller action
public ActionResult AddAccount(AccountViewModel viewModel) {
// viewModel is populated already
UpdateModel(viewModel.Profile, "Profile"); // This isn't working.
}
// Form
<form ... >
<input name='Email' />
<input name='Profile.FavoriteFood' />
<input name='Profile.FavoriteMusic' />
<button type='submit'></button>
</form>
Należy również zwrócić uwagę, że posiada własny wzór spoiwo, które dziedziczy DefaultModelBinder wykorzystywane podczas wypełniania IProfile z instancją StandardProfile w sposób CreateModel nadpisane.
Problem polega na tym, że FavoriteFood i FavoriteMusic nigdy nie są zapełniane. Jakieś pomysły? Najlepiej byłoby to zrobić w segregatorze, ale nie jestem pewien, czy jest to możliwe bez napisania całkowicie niestandardowej implementacji.
Dzięki, Brian
Pusty interfejs pozwala mi na ponowne użycie tego samego kodu źródłowego w każdej witrynie, w której używam tej opcji, przy jednoczesnym zapewnieniu innego typu profilu przy użyciu IOC. Być może będę mógł wypróbować w tym celu klasę bazową zamiast interfejsu, ale nie jestem pewien, co jeszcze mogę zrobić, co daje mi elastyczność, której szukam. Zajrzę do ModelType, o którym wspomniałeś. –
Pusta klasa podstawowa też ci nie pomoże. Więc w twoim kodzie dla metody CreateModel wywołujesz coś takiego: IoC.GetInstance(), którą podłączyłeś, aby zwrócić nowy StandardProfile? Ciekawy :). Wciąż nie jestem pewien, ile kodu można użyć ponownie, gdy wszystko, co używa IProfile, najpierw rzuciło go na właściwą klasę, ale tak ... Myślę, że określenie typu w kontekście powiązania zadziała. –
anonymous
Ponowne użycie pochodzi z faktu, że wiele kontrolerów mojej witryny znajduje się we wspólnym zestawie, do którego się odwołuję. Każda zbudowana przeze mnie strona odwołuje się do tego wspólnego zestawu dla kontrolerów i modeli. Mogę następnie dodać dodatkowe kontrolery, modele, widoki itp. Dla każdej witryny. W tym przypadku musiałem mieć możliwość definiowania całkowicie różnych pól profilu w poszczególnych witrynach. Stąd potrzeba tylko interfejsu. –