TextBoxFor值在post后没有更新

我有一个简单的强类型视图,但我似乎无法在post后更新我的表单上的文本框。

这是我的模型:

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

在我看来是一个TextBox:

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

我试图在post到我的控制器后更新文本框:

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

即使我将Number设置为新值,文本框中的文本也不会更改。 我究竟做错了什么?

在设置值之前使用ModelState.Clear()

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

将模型发布回ActionResult并返回相同的View时,模型对象的值包含在ModelState中。 ModelState包含有关有效/无效字段以及实际POSTed值的信息。 如果要更新模型值,可以执行以下两项操作之一:

ModelState.Clear()

要么

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

从我处理这个问题开始,我觉得这是框架中的设计错误。 IMO:

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

不应该从ModelState获取值,而是直接从模型中获取值。 当我改变模型并return View(model)时,至少这是我的期望。

 ModelState.Clear() 

不是一个答案,因为它清理了ModelState擦除ValidationSummary。 从ModelState删除密钥既不好,因为它删除了该密钥的ValidationSummary。

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

是正确的,但太神秘了。 因此,在这种情况下,我的偏好是使用:

  

代替

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

如果发现ModelState.Clear()过于具有破坏性,则只能定位要更改的项目,同时使用ModelState.Remove()保留其余项目。

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

此外,无论是在更新模型之前还是之后调用该方法,使用Remove()或Clear()都无关紧要。

试试这个。 如果需要,可以将其放在基本控制器中。 它对我很有用。 这使得它如此不引人注目的validation仍然有效,但模型中的值通过正确显示为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); } }