我有一个简单的强类型视图,但我似乎无法在帖子后更新表单上的文本框。
这是我的模特:
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设置为新值,文本框中的文本也不会更改。我究竟做错了什么?
答案 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);
}
}