2009-04-01 10 views
13

Grałem z ASP.NET MVC i wpadłem na coś, czego nie mogę wymyślić.ASP.NET MVC: Zmienianie właściwości modelu na poczcie zwrotnej

Załóżmy, że mam obiektu takiego:

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

a strona widzenia (Create.aspx) tak:

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

A w moim kontroler mam następujące działania:

[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); 
} 

Metoda Html.TextBox() zawsze generuje domyślne wartości pól tekstowych, nawet po pos tback, gdzie obiekt jest przekazywany z różnymi właściwościami na swoje wartości. Przyznaję, że nie mogę wymyślić prawdziwego przykładu na świecie, dlaczego chciałbym coś takiego zrobić, ale nadal nie rozumiem, dlaczego zawsze mam do czynienia z zapełnionymi polami tekstowymi z wartościami modelu, które zostały ustawione w akcji Utwórz. z atrybutem AcceptVerbs(HttpVerbs.Get).

Uwaga: Próbowałem już Html.TextBox("Name", Model.Name), ale wynik jest wciąż taki sam. I zweryfikowałem, że akcja Create z AcceptVerbs(HttpVerbs.Post) faktycznie działa, przekazując wartość poprzez ViewData do widoku. Również udana wartość jest wyświetlana, gdy wyprowadzam wartość z <%=Model.Name %>, ale znowu, nie w polu tekstowym.

Czy jest coś oczywistego, czego mi brakuje? Czy istnieje uzasadnienie tego zachowania?

+3

Możesz być także zainteresowany moją odpowiedzią na podobne pytanie - http://stackoverflow.com/questions/953330/does-html-textbox-uses-request-params-instead-of-model/954524#954524 –

Odpowiedz

14

Po powiązaniu wyniku żądania postu za pomocą deklaracji metody lub przez UpdateModel lub TryUpdateModel z obiektem takim jak TestObject, właściwość o nazwie ModelState zostanie wypełniona tymi wartościami. Pomocnicy HTML, tacy jak Textbox, zawsze będą się łączyć z modelami za pośrednictwem jawnie przekazanego obiektu modelu.

+0

Dzięki dla Twojej odpowiedzi. Czy zdarza Ci się również znać poprawny i sugerowany sposób ponownego zapełnienia elementu ModelState, podając mu obiekt? A może powinienem ręcznie przekazać klucze i wartości, po wyczyszczeniu kolekcji? –

+7

Właśnie sprawdziłem. Możesz osiągnąć to, co chcesz, wywołując funkcję ModelState.Clear() w atrybucie Utwórz akcję z postem. – dpen2000

+0

Tak, wygląda na to, że to działa. Jeszcze raz dziękuję za pomoc. Pozostawię pytanie otwarte na jakiś czas, jeśli ktoś zna inną metodę, która może być przydatna. –

3

Spróbuj tego: - (nadzieję, że będzie pracować dla Ciebie)

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

Znam ten odpowiedział już dawno temu, ale to jest bardziej ukierunkowane rozwiązanie, które działa na mnie.

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

Mam nadzieję, że to komuś pomaga.

Powiązane problemy