La valeur de TextBoxFor n’est pas mise à jour après le post

J’ai une vue simple fortement typée, mais je ne peux pas sembler mettre à jour une zone de texte sur mon formulaire après un post.

Voici mon modèle:

public class Repair { public ssortingng Number { get; set; } } 

Et à mon avis, une TextBox:

  @Html.TextBoxFor(x => x.Number) 

J’essaie de mettre à jour la zone de texte après un post sur mon contrôleur:

  [AcceptVerbs(HttpVerbs.Post)] public ActionResult Index(Repair r) { r.Number = "New Value"; return View(r); } 

Même si je mets Numérique à une nouvelle valeur, le texte dans la zone de texte ne change pas. Qu’est-ce que je fais mal?

Utilisez ModelState.Clear() avant de définir la valeur

 [AcceptVerbs(HttpVerbs.Post)] public ActionResult Index(Repair r) { ModelState.Clear(); //Added here r.Number = "New Value"; return View(r); } 

Lorsque vous publiez un modèle dans un ActionResult et que vous retournez la même vue, les valeurs des objects de modèle sont contenues dans ModelState. ModelState est ce qui contient des informations sur les champs valides / non valides ainsi que les valeurs POSTed réelles. Si vous souhaitez mettre à jour une valeur de modèle, vous pouvez effectuer l’une des opérations suivantes:

ModelState.Clear()

ou

ModelState["Number"].Value = new ValueProviderResult("New Value", "New Value", CultureInfo.CurrentCulture)

D’après mes rapports avec le problème, je pense que c’est un bogue de conception dans le cadre. OMI:

 @Html.TextBoxFor(x => x.Number) 

NE devrait PAS prendre la valeur de ModelState mais plutôt directement du modèle. Au moins, ce serait mon attente lorsque je modifierais le modèle et return View(model) .

 ModelState.Clear() 

n’est pas une réponse car elle désinfecte ModelState effaçant ValidationSummary. La suppression d’une clé de ModelState n’est pas bonne non plus, car elle supprime ValidationSummary pour cette clé.

 ModelState["Number"].Value = new ValueProviderResult("New Value", "New Value", CultureInfo.CurrentCulture) 

est correct mais trop arcanique. Ainsi, dans de tels cas, ma préférence serait d’utiliser:

  

au lieu de

 @Html.TextBoxFor(x => x.Number) 

Si vous estimez que ModelState.Clear () est trop destructeur, vous pouvez uniquement cibler l’élément que vous modifiez, tout en préservant le rest avec ModelState.Remove ().

 [AcceptVerbs(HttpVerbs.Post)] public ActionResult Index(Repair r) { r.Number = "New Value"; ModelState.Remove("Number"); return View(r); } 

De plus, il semble que peu importe que vous appeliez cette méthode avec Remove () ou Clear () avant de mettre à jour votre modèle ou après.

Essaye ça. Vous pouvez le mettre dans un contrôleur de base si vous voulez. Cela fonctionne bien pour moi. Cela rend la validation aussi discrète que possible, mais les valeurs du modèle s’affichent correctement comme EXPECTED.

 public class BaseController : Controller { public override void OnActionExecuted(ActionExecutedContext context) { ModelState.ToList().Select(x => x.Value).ToList().ForEach(x => { x.AttemptedValue = null; x.RawValue = null; }); // Do a bunch of stuff here if needed. Stuff like validation. base.OnActionExecuted(context); } }