2009-04-01 13 views
13

Ich habe mit ASP.NET MVC gespielt und lief in etwas, das ich nicht herausfinden kann.ASP.NET MVC: Ändern der Eigenschaften des Modells auf Postback

Angenommen, ich habe ein Objekt wie folgt aus:

public class TestObject 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

Und eine Ansichtsseite (Create.aspx) wie folgt aus:

<form action="/Create" method="post"> 
    <p> 
     <%=Html.TextBox("Name") %> 
    </p> 
    <p> 
     <%=Html.TextBox("Age")%> 
    </p> 
</form> 

Und auf meinem Controller habe ich diese Aktionen:

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Create() 
{ 
    return View(new TestObject { Name = "DefaultName", Age = 10 }); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(TestObject o) 
{ 
    o.Name = "ChangedNameToSomethingElse"; 
    o.Age = 15; 
    return View(o); 
} 

Die Methode Html.TextBox() erzeugt immer die Textfelder mit den Standardwerten, auch nach der pos tback, wo das Objekt mit verschiedenen Eigenschaften für seine Werte zurückgegeben wird. Nun, zugegeben, ich kann mir kein Beispiel aus der realen Welt vorstellen, warum ich so etwas tun möchte, aber ich verstehe immer noch nicht, warum ich immer Textfelder mit den Werten des Modells bevölkert habe, die in der Aktion Erstellen festgelegt wurden mit dem AcceptVerbs(HttpVerbs.Get) Attribut.

Hinweis: Ich habe versucht Html.TextBox("Name", Model.Name), aber das Ergebnis ist immer noch das gleiche. Und ich habe überprüft, dass die Create-Aktion mit AcceptVerbs(HttpVerbs.Post) tatsächlich ausgeführt wird, indem Sie einen Wert über ViewData an die Ansicht übergeben. Auch der udated Wert wird angezeigt, wenn ich den Wert mit <%=Model.Name %> aber wieder, nicht auf der Textbox ausgab.

Gibt es etwas Offensichtliches, das ich vermisse, oder gibt es eine Begründung für dieses Verhalten?

+3

Sie könnten auch in meiner Antwort auf ähnliche Frage - http://stackoverflow.com/questions/953330/does-html-textbox-uses-request-params-instead-of-model/954524#954524 –

Antwort

14

Wenn Sie das Ergebnis einer Postanforderung über die Deklaration der Methode oder von UpdateModel oder TryUpdateModel an ein Objekt wie TestObject binden, wird eine Eigenschaft namens ModelState mit diesen Werten gefüllt. Die HTML-Helfer wie Textbox binden immer über ein explizit übergebenes Modellobjekt an modelstate.

+0

Vielen Dank für deine Antwort. Kennen Sie zufällig auch den richtigen und den vorgeschlagenen Weg, den ModelState wieder zu füllen, indem Sie ihm vielleicht ein Objekt geben? Oder sollte ich die Schlüssel und die Werte manuell eingeben, nachdem ich die Sammlung gelöscht habe? –

+7

habe ich gerade überprüft. Sie können erreichen, was Sie erreichen möchten, indem Sie ModelState.Clear() in Ihrer Create-Aktion mit dem Attribut Post aufrufen. – dpen2000

+0

Ja, sieht so aus, als ob es funktioniert. Vielen Dank für Ihre Hilfe. Ich werde die Frage für eine Weile offen lassen, falls jemand eine andere Methode kennt, die auch nützlich sein könnte. –

3

Versuchen Sie dieses: - (hoffe, es wird für Sie arbeiten)

[HttpPost] 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(TestObject o) { 
    ModelState.Clear();  
    o.Name = "ChangedNameToSomethingElse";  
    o.Age = 15; 
    return View(o); 
} 
9

Ich weiß, das vor langer Zeit beantwortet wurde, aber das ist eine gezieltere Lösung, die für mich funktioniert.

[HttpPost] 
public ActionResult Create(TestObject o) { 
    ModelState.Remove("Name");  
    o.Name = "ChangedNameToSomethingElse";  
    ModelState.Remove("Age");  
    o.Age = 15; 
    return View(o); 
} 

Hoffe, dass dies jemand da draußen hilft.

Verwandte Themen