我遇到的情况是,有一个名为“Date”的 HTTP GET 参数,这使得我无法创建一个名为“Date”的文本框并在其上设置我想要的值。
在我看来,如果我写:
@Html.TextBox("Date", "99/99/9999")
文本框将不会使用值 99/99/9999
呈现,而是使用来自请求的值呈现,比方说:02/07/2012
。如果我使用 EditorFor
从 View 模型传递一个值(我主动将其设置为与 02/07/2012
不同的值),也会发生同样的情况
无论如何我都无法覆盖请求数据。
我应该做什么?
编辑
正如 Darin Dimitrov 明智地解释的那样,每当您想要修改来自请求的值以便将其显示在 View 中时,您都必须将其从 ModelState
中删除。
这在处理 GET 请求中的 DateTime 时特别有用。 ASP.NET MVC 模型绑定(bind)强制 GET 请求中的日期采用 MM/dd/yyyy
格式。但是,当您想要向用户显示它时,您可能需要使用 DisplayFormatAttribute
将其重新格式化为 dd/MM/yyyy
。但是,除非您先从 ModelState 中删除日期,否则这是不可能的。
最佳答案
What should I do?
将其从 POST Controller 操作中的 ModelState 中删除:
[HttpPost]
public ActionResult Foo(MyViewModel model)
{
ModelState.Remove("Date");
return View(model);
}
显然你不会不愿意使用弱类型助手:
@Html.TextBox("Date", "99/99/9999")
您想要使用强类型模型和编辑器模板:
@Html.EditorFor(x => x.Date)
在您的 POST Controller 操作中,您将设置所需的日期:
[HttpPost]
public ActionResult Foo(MyViewModel model)
{
ModelState.Remove("Date");
model.Date = "99/99/9999";
return View(model);
}
我在这里明确使用字符串作为 Date 属性,这可能是错误的,我只是对 99/99/9999 字符串作为日期的有效性感到困惑。但显然这也适用于日期。
原因是 HTML 帮助程序在绑定(bind)其值时首先查看 ModelState,然后在模型中查看。因此,即使您修改模型中的值,如果 ModelState 中有不同的值(这通常发生在 POST 操作中),那么将使用 ModelState 中的值。这是设计使然。
关于.net - 我的 HTML 编辑器忽略我设置的任何值,并且始终从请求数据中获取它们的值。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9163445/