TextBoxFor值在帖子后没有更新

bro*_*oke 12 c# asp.net-mvc asp.net-mvc-4

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

这是我的模型:

public class Repair
  {
    public string Number { get; set; }      
  }
Run Code Online (Sandbox Code Playgroud)

在我看来是一个TextBox:

   @Html.TextBoxFor(x => x.Number)
Run Code Online (Sandbox Code Playgroud)

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

 [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Index(Repair r)
        {

          r.Number = "New Value";

          return View(r);

        }
Run Code Online (Sandbox Code Playgroud)

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

Sat*_*pal 25

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

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


Tom*_*mmy 11

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

ModelState.Clear()

要么

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


小智 6

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

@Html.TextBoxFor(x => x.Number) 
Run Code Online (Sandbox Code Playgroud)

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

ModelState.Clear() 
Run Code Online (Sandbox Code Playgroud)

不是答案,因为它ModelState消除了擦除ValidationSummary.从中删除密钥ModelState既不好,因为它删除了该密钥的ValidationSummary.

ModelState["Number"].Value = 
new ValueProviderResult("New Value", "New Value", CultureInfo.CurrentCulture)
Run Code Online (Sandbox Code Playgroud)

是正确的但是太神秘了.因此,在这种情况下,我倾向于使用:

<input type="text" name="Number" id="Number" value="@Model.Number"/>
Run Code Online (Sandbox Code Playgroud)

代替

@Html.TextBoxFor(x => x.Number)  
Run Code Online (Sandbox Code Playgroud)