Hier ist mein Szenario.Wert mit HTML-Erweiterung unterscheidet sich von dem, was es sein soll, wenn zwei Modelle eine Eigenschaft mit demselben Namen haben
Erstellt zwei Modelle, die eine gemeinsame Eigenschaft Name
public class SimpleModel1 { // Some Properties public string Property1 { get; set; } } public class SimpleModel2 { // Some Properties public string Property1 { get; set; } // Same name as Property1 in SimpleModel1 }
Gebrauchte SimpleModel1 in einer Aktion (zB für Index) haben, die eine Ansicht zurückgibt, wie diese
@model MvcApplication2.Models.SimpleModel1 @{ ViewBag.Title = "Home Page"; } @using (Html.BeginForm("Test", "Home", FormMethod.Post)) { <label>Enter something here</label> @Html.TextBoxFor(m => m.Property1) <button type="submit">Submit</button> }
- sieht Der Wert wurde an eine Test-Aktion übergeben, die SimpleModel1 als Parameter akzeptiert, einige Aufgaben ausführt und eine Ansicht zurückgibt, die SimpleModel2akzeptiert
public ActionResult Test(SimpleModel1 model) { SimpleModel2 newModel = new SimpleModel2(); // Do Something newModel.Property1 = "Something different than model's Property1"; return View(newModel); }
Die Test.cshtml (Ansicht von Test-Aktion zurück) ist wie folgt:
@model MvcApplication2.Models.SimpleModel2 @{ ViewBag.Title = "Test"; } <h2>Test</h2> @* Model Propery without using HTML extension*@ @Model.Property1 @* Model property using HTML extension (Incorrect) *@ @Html.TextBoxFor(m => m.Property1) @Html.HiddenFor(m => m.Property1) @Html.TextAreaFor(m => m.Property1) @* Correct Value *@ <input value="@Model.Property1" />
Was ich erwarte, ist, dass alle Werte von Property1 „Etwas anderes als Modell des Property1 wäre "Wie in der Testaktion festgelegt. Es stellt sich jedoch heraus, dass diejenigen, die die Html-Erweiterung (Html.TextBoxFor, Html.HiddenFor usw.) verwenden, den Property1-Wert haben, der an Test Action gesendet wurde. Wenn ich zum Beispiel "Was für eine Überraschung" (die Property1 von SimpleModel1) an Test Action posten möchte, ist der Wert von Property1 von SimpleModel2 auch "Was für eine Überraschung", egal, worauf ich es eingestellt habe.
Ich habe keine Ahnung was los ist. Sieht für mich wie ein Käfer aus. Hat jemand eine Idee?
Das funktionierte, aber warum ist das ein Problem mit HTML-Erweiterungsmethoden? Wie kommt es, dass @ Model.Property1 den richtigen Wert anzeigt? –
Intern HTML-Erweiterungs-Methoden betrachten den Wert in ModelState, um den Wert für die Eigenschaft zu bestimmen. So werden sie geschrieben. Ich kann nicht sagen, warum sie so geschrieben sind. Hoffentlich kann jemand anderes. Ich würde es auch gerne wissen. – Dmitry
@Dmitry Wenn Sie über eine Post-Methode verfügen, die statt ViewModel mehrere Parameter einzeln verwendet oder die Formularsammlung zum Abrufen von Werten verwendet hat, müssen Sie bei einem POST mit fehlgeschlagener Validierung kein Mahlzeitenkonstrukt erstellen ein neues Ansichtsmodell und legen Sie alle verschiedenen Eigenschaften aus den Formularelementen fest, da das Formular automatisch vom ModelState ausgefüllt wird. Für den Rest von uns, der ein ViewModel im POST-Parameter verwendet, wird es für ModelState lästig, Vorrang vor dem View-Modell zu haben. – AaronLS