Ich versuche UpdateModel zu erhalten, um ein Modell zu füllen, das als nur eine Schnittstelle zur Kompilierungszeit festgelegt ist. Zum Beispiel habe ich:ASP.NET MVC UpdateModel mit Schnittstelle
// 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>
Beachten Sie auch, dass ich ein benutzerdefiniertes Modell Binder haben, die von Default erbt verwendet werden, die IProfile mit einer Instanz von Standardprofile in der überschriebenen Methode Create auffüllt.
Das Problem ist, dass FavoriteFood und FavoriteMusic nie bevölkert sind. Irgendwelche Ideen? Idealerweise würde dies alles in der Modellmappe geschehen, aber ich bin mir nicht sicher, ob es möglich ist, ohne eine komplett benutzerdefinierte Implementierung zu schreiben.
Danke, Brian
Die leere Schnittstelle ermöglicht es mir, den gleichen Kerncode-Code auf jeder Site, auf der ich diese verwende, wiederzuverwenden, während ich einen anderen Profiltyp mit einem IOC zur Verfügung stelle. Ich könnte zu diesem Zweck vielleicht eine Basisklasse anstelle einer Schnittstelle ausprobieren, aber ich bin nur unsicher, was ich sonst noch tun kann, das gibt mir die Flexibilität, die ich suche. Ich werde mir den von Ihnen erwähnten ModelType ansehen. –
Eine leere Basisklasse wird dir auch nicht viel nützen. Also in Ihrem Code für die CreateModel-Methode rufen Sie etwas wie: IoC.GetInstance(), die Sie ein neues StandardProfile zurückgegeben haben? Interessant :). Ich bin immer noch unklar, wie viel Code Wiederverwendung Sie bekommen können, wenn alles, was IProfile verwendet, muss es zuerst in die richtige Klasse zu werfen, aber yah ... Ich denke, die Angabe des Typs im Bindungskontext funktioniert. –
anonymous
Die Wiederverwendung kommt von der Tatsache, dass viele der Controller meiner Site in einer gemeinsamen Assembly sind, die ich referenziere. Jede Site, die ich erstelle, verweist auf diese allgemeine Assembly für Controller und Modelle. Ich kann dann zusätzliche Controller, Modelle, Ansichten usw. für jede Site hinzufügen. In diesem Fall musste ich in der Lage sein, völlig unterschiedliche Profilfelder auf einer Site-by-Site-Basis zu definieren. Daher die Notwendigkeit für nur eine Schnittstelle hier. –