J'essaie d'obtenir UpdateModel pour remplir un modèle qui est défini uniquement comme une interface lors de la compilation. Par exemple, j'ai:ASP.NET MVC UpdateModel avec l'interface
// 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>
Notez également que j'ai un liant de modèle personnalisé qui hérite de DefaultModelBinder utilisé qui renseigne IPROFILE avec une instance de StandardProfile dans la méthode surchargée de CreateModel.
Le problème est que FavoriteFood et FavoriteMusic ne sont jamais remplis. Des idées? Idéalement, tout cela serait fait dans le classeur modèle, mais je ne suis pas sûr que ce soit possible sans écrire une implémentation complètement personnalisée.
Merci, Brian
L'interface vide me permet de réutiliser le même code de base sur chaque site sur lequel je l'utilise, tout en fournissant un type de profil différent en utilisant un IOC. Je pourrais peut-être essayer une classe de base à la place d'une interface à cet effet, mais je ne suis pas sûr de ce que je peux faire d'autre qui me donne la flexibilité que je cherche. Je vais regarder dans le ModelType que vous avez mentionné. –
Une classe de base vide ne vous fera pas beaucoup de bien non plus. Donc, dans votre code pour la méthode CreateModel vous appelez quelque chose comme: IoC.GetInstance() que vous avez branché pour retourner un nouveau profil standard? Intéressant :). Je ne sais toujours pas quelle réutilisation de code vous pouvez obtenir quand tout ce qui utilise IProfile doit le lancer dans la bonne classe en premier, mais yah ... Je pense que spécifier le type dans le contexte de liaison fonctionnera. –
anonymous
La réutilisation vient du fait que beaucoup de contrôleurs de mon site sont dans un assemblage commun que je référence. Chaque site que je construis fait référence à cet assemblage commun pour les contrôleurs et les modèles. Je peux ensuite ajouter des contrôleurs, des modèles, des vues, etc. spécifiques pour chaque site. Dans ce cas, je devais pouvoir définir des champs de profil entièrement différents sur une base site par site. D'où le besoin d'une interface juste ici. –