我的HTML编辑器忽略了我设置的任何值,并始终从请求数据中获取它们的值.为什么?

And*_*ena 2 .net asp.net-mvc-3

我有一种情况,其中有一个名为"Date"的HTTP GET参数,这使我无法创建名为"Date"的TextBox并在其上设置我想要的值.

在我看来,如果我写:

@Html.TextBox("Date", "99/99/9999")
Run Code Online (Sandbox Code Playgroud)

TextBox将不会显示值,99/99/9999而是显示来自请求的值,例如:02/07/2012.如果我使用EditorFor视图模型中的值(我主动设置为不同的值02/07/2012),也会发生同样的情况

无论怎样,我无法覆盖请求数据.

我该怎么办?

编辑

正如Darin Dimitrov明智地解释的那样,每当您想要修改来自请求的值以便在View中显示它时,您必须将其从中删除ModelState.

这在处理GET请求中的DateTime时特别有用.ASP.NET MVC模型绑定强制日期为MM/dd/yyyyGET请求中的格式.但是当您想要将其显示给用户时,您可能希望将其重新格式化为dd/MM/yyyy可能使用的DisplayFormatAttribute.但是,除非您先从ModelState中删除日期,否则这是不可能的.

Dar*_*rov 5

我该怎么办?

从POST控制器操作中的ModelState中删除它:

[HttpPost]
public ActionResult Foo(MyViewModel model)
{
    ModelState.Remove("Date");
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

显然你不会与弱类型助手一起工作:

@Html.TextBox("Date", "99/99/9999")
Run Code Online (Sandbox Code Playgroud)

您想使用强类型模型和编辑器模板:

@Html.EditorFor(x => x.Date)
Run Code Online (Sandbox Code Playgroud)

在POST控制器操作中,您将设置所需的日期:

[HttpPost]
public ActionResult Foo(MyViewModel model)
{
    ModelState.Remove("Date");
    model.Date = "99/99/9999";
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

我已经明确地使用了字符串作为Date属性,这可能是错误的,我只是把99/99/9999字符串的有效性作为日期而难倒.但显然同样适用于日期.

原因是HTML帮助程序在绑定它们的值时首先查看ModelState,然后在模型中查看.因此,即使您修改模型中的值,如果ModelState中有不同的值(通常在POST操作中发生),它将是将被使用的ModelState中的值.这是设计的.