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

标签 .net asp.net-mvc-3

我遇到的情况是,有一个名为“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/

相关文章:

c# - 如何在 Html.Editor 中直接加载 Object additionalViewData 的值?

c# - 动态 Getvalue 返回对象转换为 PropertyInfo.PropertyType

c# - 是否可以将一个表格放在另一个表格之上,而不是 TopMost?

c# - 使用 @HTML.Action(...) 的局部 View

asp.net-mvc-3 - MVC3比MVC2有什么优势

asp.net-mvc-3 - Ninject 到一个 Webactivator 调用的类中

asp.net-mvc-3 - Razor 模型类型转换

c# - Parallel.Foreach 在幕后做了什么?

asp.net - 在任何操作之前执行代码

c# - .NET,C#,反射 : list the fields of a field that, 本身,有字段