TextBoxFor值在帖子后没有更新

时间:2013-08-27 16:51:23

标签: c# asp.net-mvc asp.net-mvc-4

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

这是我的模特:

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

在我看来是一个TextBox:

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

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

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

          r.Number = "New Value";

          return View(r);

        }

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

5 个答案:

答案 0 :(得分:22)

在设置值

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

答案 1 :(得分:9)

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

ModelState.Clear()

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

答案 2 :(得分:6)

从我处理这个问题开始,我觉得这是设计中的错误。 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)

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

<input type="text" name="Number" id="Number" value="@Model.Number"/>

而不是

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

答案 3 :(得分:3)

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

保留其余项目。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(Repair r)
{
    r.Number = "New Value";
    ModelState.Remove("Number");
    return View(r);
}

此外,无论是在更新模型之前还是在

之后调用该方法,看起来与Remove()或Clear()无关。

答案 4 :(得分:1)

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