Estoy intentando que UpdateModel llene un modelo que está configurado como solo una interfaz en tiempo de compilación. Por ejemplo, tengo:ASP.NET MVC UpdateModel con la interfaz
// 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>
También tenga en cuenta que tengo un modelo de carpeta de encargo que hereda de DefaultModelBinder siendo utilizado que puebla iProfile con una instancia de StandardProfile en el método CreateModel overriden.
El problema es que FavoriteFood y FavoriteMusic nunca se completan. ¿Algunas ideas? Idealmente, todo esto se haría en la carpeta de modelo, pero no estoy seguro de que sea posible sin escribir una implementación completamente personalizada.
Gracias, Brian
La interfaz vacía me permite reutilizar el mismo código de código central en cada sitio en el que lo uso, al mismo tiempo que proporciono un tipo de perfil diferente con un IOC. Es posible que pueda probar una clase base en lugar de una interfaz para este propósito, pero no estoy seguro de qué más puedo hacer que me brinde la flexibilidad que estoy buscando. Veré el ModelType que has mencionado. –
Una clase base vacía tampoco te servirá de mucho. Entonces, en su código para el método CreateModel, usted está llamando algo así como: IoC.GetInstance() que ha conectado para devolver un nuevo StandardProfile Interesante :). Todavía no estoy seguro de cuánta reutilización de código puede obtener cuando todo lo que usa IProfile tiene que emitirlo primero a la clase correcta, pero ya ... creo que la especificación del Tipo en el contexto vinculante funcionará. –
anonymous
La reutilización proviene del hecho de que muchos de los controladores de mi sitio se encuentran en un conjunto común al que hago referencia. Cada sitio que construyo hace referencia a este conjunto común para controladores y modelos. Luego puedo agregar controladores adicionales, modelos, vistas, etc. específicos para cada sitio. En este caso, necesitaba poder definir campos de perfil completamente diferentes sitio por sitio. De ahí la necesidad de solo una interfaz aquí. –