17

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

这是我的模型:

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

在我看来是一个文本框:

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

在向我的控制器发布帖子后,我正在尝试更新文本框:

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

          r.Number = "New Value";

          return View(r);

        }

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

4

5 回答 5

31

ModelState.Clear()设定值前使用

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(Repair r)
{
    ModelState.Clear(); //Added here
    r.Number = "New Value";
    return View(r);
}
于 2013-08-27T16:55:11.670 回答
12

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

ModelState.Clear()

或者

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

于 2013-08-27T16:54:19.590 回答
9

从我对这个问题的处理来看,我觉得这是框架中的设计错误。海事组织:

@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)  
于 2015-06-26T18:19:27.747 回答
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() 似乎都无关紧要

于 2017-07-12T00:09:30.910 回答
1

试试这个。如果需要,您可以将其放入基本控制器中。这对我来说效果很好。它使它如此不显眼的验证仍然有效,但模型中的值正确显示为预期。

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);
    }
}
于 2018-03-09T06:48:44.250 回答