Frage

Es gibt ein paar ähnlichen Fragen, aber ich kann keine Antwort, dass die Arbeiten finden.

Unter der Annahme, ich habe die folgenden Modelle:

public class EditorViewModel
{
  public Account Account {get;set;}
  public string SomeSimpleStuff {get;set;}
}

public class Account
{
  public string AccountName {get;set;}
  public int MorePrimitivesFollow {get;set;}
}

und eine Ansicht, die ViewPage<EditorViewModel> erstreckt, die die folgende tut:

<%= Html.TextBoxFor(model => model.Account.AccountName)%>
<%= Html.ValidationMessageFor(model => model.Account.AccountName)%>
<%= Html.TextBoxFor(model => model.SomeSimpleStuff )%>
<%= Html.ValidationMessageFor(model => model.SomeSimpleStuff )%>

und mein Controller sieht aus wie:

[HttpPost]
public virtual ActionResult Edit(EditorViewModel account)
{ /*...*/ }

Wie kann ich die Default richtig binden meine EditorViewModel? Ohne etwas Besonderes zu tun, ich eine leere Instanz meiner EditorViewModel mit allem, was null oder Standard erhalten.

Die nächstgelegene ich gekommen ist durch UpdateModel Aufruf manuell:

[HttpPost]
public virtual ActionResult Edit(EditorViewModel account)
{
    account.Account = new Account();
    UpdateModel(account.Account, "Account");
    // this kills me:
    UpdateModel(account);

Das aktualisiert erfolgreich mein Konto Eigenschaft Modell, aber wenn ich auf Update account nennen (den Rest der öffentlichen Eigenschaften meines EditorViewModel zu bekommen) ich die völlig nutzlos bekommen „Das Modell des Typs ... konnte nicht aktualisiert werden.“ Es gibt keine innere Ausnahme, so dass ich nicht herausfinden kann, was falsch läuft.

Was soll ich damit?

War es hilfreich?

Lösung

Das Bindemittel ist verwirrt zu werden, weil er sieht, dass der Parameter auf Ihre Aktion-Methode genannt wird Konto , und es sieht eingehende Formularfelder namens account.accountname , so sieht es für eine Kontoname-Eigenschaft auf Ihrem EditorViewModel.

Sie können dieses Problem beheben, indem Sie den Parameter auf etwas anderes umbenennen, die nicht in Konflikt mit einem eingehenden Formularfeld der Fall ist, oder Sie können ein stick [Bind (Präfix = „“)] Attribut auf den Parameter. Dieses Attribut sagt „die Tatsache ignorieren, dass der Parameter der Namen Konto , und so tun, als ich ihm einen leeren String-Namen statt gegeben hatte.“ Dann wird das Bindemittel sucht account.accountname statt account.account.accountname .

Bearbeiten - weitere Infos:

Wenn das Bindemittel einen komplexen Parameter sieht den Namen foo , sieht es bei der aktuellen Anforderung für alles * foo genannt. **. Also, wenn Ihr Parameter genannt wurden foo und seine Art hatte eine Eigenschaft mit dem Namen Vorname , würde der eingehende Wert erwartet werden foo.FirstName = John zum Beispiel.

Wenn jedoch das Bindemittel keinen * foo sieht. ** als Teil des Antrags, es sieht nur für die * direkt (ohne die foo Präfix). Also, solange es keine * foo war. ** in der Anfrage, können Sie einreichen Vorname = John und das Bindemittel würde das richtig verstanden dies. Aber wenn es irgendeine * foo. ** als Teil des Antrags, die Vorname = John Wert die Eigenschaft Firstname nicht überein.

Sie können nun sehen, wie die Parameter auf Ihre Aktion-Methode die gleichen Namen wie eine seiner Eigenschaften geben würde diese Logik abwerfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top