Lasst uns sagen, dass Sie ein Modell haben, die Art wie folgt aussieht:MVC Update wenn die Namen nicht übereinstimmen
public class MyClass {
public string Name { get; set; }
public DateTime MyDate { get; set; }
}
Die Standard-Vorlage bearbeiten, die Visual Studio gibt Ihnen eine einfache Textbox für die MyDate
Eigentum. Das ist alles schön und gut, aber lassen Sie uns sagen, dass Sie, dass bis aufspalten müssen in es ist Monat/Tag/Jahr-Komponenten und Ihre Form wie folgt aussieht:
<label for="MyDate">Date:</label>
<%= Html.TextBox("MyDate-Month", Model.MyDate.Month) %>
<%= Html.TextBox("MyDate-Day", Model.MyDate.Day) %>
<%= Html.TextBox("MyDate-Year", Model.MyDate.Year) %>
Wenn dieses eingereicht, um einen Anruf zu UpdateModel
won‘ t arbeiten, da es keine Definition für MyDate-Month
gibt. Gibt es eine Möglichkeit, dem Projekt einen benutzerdefinierten Ordner hinzuzufügen, um Situationen wie diese zu behandeln, oder wenn die HTML-Eingaben (aus welchen Gründen auch immer) anders benannt werden?
Eine Abhilfe, die ich gefunden habe, ist JavaScript zu verwenden, um einen versteckten Eingang in die Form vor der Vorlage zu injizieren, die die Felder verkettet und richtig benannt, aber das fühlt sich falsch an.
Interessanter Ansatz. Ich kenne mich nicht mit benutzerdefinierten Modellbindern aus. Wie kann ich dies vom Controller aus aufrufen? Und muss ich etwas für "normale" Eigenschaften hinzufügen (wie der Name in meinem Beispiel) oder wird der Standardbinder dafür sorgen? Vielen Dank. – swilliams
In meinem ursprünglichen Beitrag schlug ich vor, IModelBinder direkt zu implementieren, was bedeuten würde, dass Sie alle Eigenschaften manuell behandeln müssen und nicht nur MyDate, was mühsam werden könnte. Ich habe meinen Beitrag so geändert, dass MyClassBinder jetzt vom DefaultModelBinder abgeleitet wird, was bedeutet, dass Standardeigenschaften wie "Name" als Standard behandelt werden. –
Sie müssen es nicht vom Controller aus aufrufen. Sie müssen nur den Binder in Application_Start registrieren, und er wird vom Framework vor der Controller-Aktion genauso wie der Standardmodellbinder aufgerufen. –