Я пытаюсь получить UpdateModel для заполнения модели, которая устанавливается как только интерфейс во время компиляции. Например, у меня есть:ASP.NET MVC UpdateModel с интерфейсом
// 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>
Также отметим, что у меня есть пользовательские модели связующего, который наследует от DefaultModelBinder используется, заполняющий IProfile с экземпляром StandardProfile в переопределен методом CreateModel.
Проблема в том, что FavoriteFood и FavoriteMusic никогда не заселены. Есть идеи? В идеале это все будет сделано в привязке к модели, но я не уверен, что это возможно без написания полностью пользовательской реализации.
Спасибо, Брайан
Пустой интерфейс позволяет мне повторно использовать один и тот же код кода ядра на каждом сайте, на котором я использую это, а также поставлять другой тип профиля с использованием IOC. Я мог бы попробовать базовый класс вместо интерфейса для этой цели, но я просто не знаю, что еще я могу сделать, что дает мне гибкость, которую я ищу. Я рассмотрю упомянутый вами ModelType. –
Пустой базовый класс тоже вам не поможет. Итак, в вашем коде для метода CreateModel вы вызываете что-то вроде: IoC.GetInstance(), который вы подключили, чтобы вернуть новый стандартный файл? Интересно :). Я до сих пор неясно, сколько повторного использования кода вы можете получить, когда все, что использует IProfile, должно сначала перенести его в нужный класс, но я ... Я думаю, что определение типа в контексте привязки будет работать. –
anonymous
Повторное использование происходит из-за того, что многие контроллеры моего сайта находятся в общей сборке, которую я ссылаюсь. Каждый сайт, который я построил, ссылается на эту общую сборку для контроллеров и моделей. Затем я могу добавить дополнительные контроллеры, модели, представления и т. Д. Для каждого сайта. В этом случае мне нужно было иметь возможность определять совершенно разные поля профиля на основе каждого узла. Следовательно, здесь нужен только интерфейс. –