2012-12-19 12 views
5

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

  1. 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 
    
    } 
    
  2. 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> 
    } 
    
  3. sieht Der Wert wurde an eine Test-Aktion übergeben, die SimpleModel1 als Parameter akzeptiert, einige Aufgaben ausführt und eine Ansicht zurückgibt, die SimpleModel2

    akzeptiert
    public ActionResult Test(SimpleModel1 model) 
    { 
        SimpleModel2 newModel = new SimpleModel2(); 
    
        // Do Something 
    
        newModel.Property1 = "Something different than model's Property1"; 
    
        return View(newModel); 
    } 
    
  4. 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?

Antwort

10

Sie werden dieses Verhalten bei der Ausführung eines POST sehen, da die geposteten Daten in ModelState beibehalten werden. Der Wert für Property1 ist der Wert, der für diese Eigenschaft angegeben wurde. Um Ihren neuen Wert sehen Sie diese Codezeile in Ihrer Action Test umfassen müssen:

ModelState.Clear(); 

In der Regel nur daran erinnern, diese Zeile in Fall umfassen Sie Daten zu veröffentlichen, es zu modifizieren und zu versuchen, Siehe geänderte Daten für die zurückgegebene Ansicht.

+0

Das funktionierte, aber warum ist das ein Problem mit HTML-Erweiterungsmethoden? Wie kommt es, dass @ Model.Property1 den richtigen Wert anzeigt? –

+0

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

+3

@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