2009-04-01 16 views
13

Ho giocato con ASP.NET MVC e ho trovato qualcosa che non riesco a capire.ASP.NET MVC: modifica delle proprietà del modello sul postback

Supponiamo che io sono un oggetto come questo:

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

E una pagina di visualizzazione (Create.aspx) come questo:

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

E sul mio regolatore ho queste azioni:

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

Il metodo Html.TextBox() genera sempre le caselle di testo con i valori predefiniti, anche dopo la posizione tback, dove l'oggetto viene restituito con proprietà diverse sui suoi valori. Ora, scontato, non riesco a pensare ad un esempio del mondo reale perché vorrei fare una cosa del genere ma non riesco ancora a capire perché finisco sempre con l'inserimento di caselle di testo con i valori del modello impostati sull'azione Create con l'attributo AcceptVerbs(HttpVerbs.Get).

Nota: ho provato Html.TextBox("Name", Model.Name) ma il risultato è sempre lo stesso. E ho verificato che l'azione Crea con AcceptVerbs(HttpVerbs.Post) venga effettivamente eseguita, passando un valore tramite ViewData alla vista. Inoltre, il valore udated viene visualizzato quando emetto il valore con <%=Model.Name %> ma ancora, non sulla casella di testo.

C'è qualcosa di ovvio che mi manca o c'è un motivo dietro questo comportamento?

+3

Potresti anche essere interessato alla mia risposta a una domanda simile - http://stackoverflow.com/questions/953330/does-html-textbox-uses-request-params-instead-of-model/954524#954524 –

risposta

14

Se si associa il risultato di una richiesta di posta tramite la dichiarazione del metodo o da UpdateModel o TryUpdateModel a un oggetto come TestObject, una proprietà denominata ModelState verrà riempita con questi valori. Gli helper HTML come Textbox si collegheranno sempre a modelstate su un oggetto modello esplicitamente passato.

+0

Grazie per la tua risposta. Conosci anche il modo corretto e suggerito per ri-popolare il ModelState, dandogli un oggetto forse? O dovrei dare manualmente le chiavi e i valori ad esso, dopo aver cancellato la collezione? –

+7

Ho appena controllato. Puoi ottenere ciò che desideri chiamando ModelState.Clear() nella tua azione Crea con l'attributo Post. – dpen2000

+0

Sì, sembra che funzioni. Grazie ancora per il tuo aiuto. Lascerò la domanda aperta per un po 'nel caso qualcuno conosca un metodo diverso che potrebbe anche essere utile. –

3

provare questo: - (spero che lavorerà per voi)

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

So che questo è stato risposto molto tempo fa, ma questa è la soluzione più mirato che funziona per me.

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

Spero che questo aiuti qualcuno là fuori.

Problemi correlati