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中删除日期,否则这是不可能的.
我该怎么办?
从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中的值.这是设计的.