2012-08-31 16 views
5

In un certo numero di situazioni ho riscontrato un problema in cui ho un modello creato sul server come risultato di valori postati. Al momento dell'elaborazione del modello, alcuni valori del modello vengono modificati e quindi nuovamente visualizzati sulla pagina. C'è un modo semplice per sovrascrivere il comportamento che fa sì che il framework MVC utilizzi il valore POSTed invece del valore del mio modello.MVC3: Come forzare Html.TextBoxFor a utilizzare il valore del modello anziché il valore POSTed

Esempio:

Modello

public class MyModel { 
    public string Value1 { get; set; } 
} 

controller

public MyController : Controller { 
    public ActionResult MyAction() { 
     var model = new MyModel(); 
     model.Value1 = "OldValue"; 
     return View(model); 
    } 
    [HttpPost] 
    public ActionResult MyAction(MyModel model) { 
     model.Value1 = "NewValue"; 
     return View(model); 
    } 
} 

View

@using(Html.BeginForm("MyAction", "My", FormMethod.Post) { 
    @Html.TextBoxFor(m => m.Value1) 
    <input type="submit"/> 
} 

Quando questa pagina viene caricato, la casella di testo conterrà "OldValue". Dopo aver fatto clic su Invia, la casella di testo contiene ancora "OldValue" poiché è ciò che è stato inviato POST al server, ma voglio che crei la seconda pagina (dopo il POST) con il valore dal modello (NewValue).

C'è un modo semplice per dire a MVC di comportarsi in questo modo? Non sono sicuro di cosa dovrei fare in questa situazione per ottenere il risultato desiderato.

Nota: questo è tutto pseudocodice, quindi potrei avere alcuni errori, ma il concetto dovrebbe esserci.

risposta

8

Nel reindirizzamento (Post - Redirect - Ottieni schema).

[HttpPost] 
public ActionResult MyAction(MyModel model) { 
    model.Value1 = "NewValue"; 
    return RedirectToAction("MyAction"); 
} 

EDIT

Cancella lo stato modello per passare di nuovo un modello modificato

[HttpPost] 
    public ActionResult MyAction(MyModel model) 
    { 
     var newModel = new MyModel(); 
     newModel = model; 
     ModelState.Clear(); 
     newModel.Value1 = "NewValue"; 
     return View(newModel); 
    } 
+0

Grazie per il suggerimento, ma il mio esempio è semplificato e davvero non si vuole reindirizzare appena a GET. Suppongo di poterlo fare, ma speravo in una soluzione che potesse far sì che il modello sostituisse i valori POSTed. –

+0

@LeslieHanks - Ci scusiamo per l'incomprensione, per favore vedi la mia modifica. –

+0

Ulteriori dettagli qui: http://blogs.msdn.com/b/simonince/archive/2010/05/05/asp-net-mvc-s-html-helpers-render-the-wrong-value.aspx –

0

Non c'è un modo per farlo con gli aiutanti incorporati. È necessario farlo manualmente

Utilizzando aiutanti per ottenere il nome:

<input type="text" name="@Html.NameFor(m => m.MyField)" value="@Model.MyField"/> 
Problemi correlati