我有这样的动作
public ActionResult Overview(TimeAxisVM TimeAxis = null)
{
return View(new OverviewVM());
}
像这样查看模型
public class TimeAxisVM
{
// omitted ctor
[DataType(DataType.DateTime)]
public DateTime? From { get; set; }
[DataType(DataType.DateTime)]
public DateTime? To { get; set; }
}
视图模型的编辑器模板
@model TimeAxisVM
@using (Html.BeginForm("Overview", "Controller", FormMethod.Get))
{
@Html.EditorFor(model => model.From)
@Html.EditorFor(model => model.To)
<button type="submit">Submit</button>
}
以及如下所示的"概述"操作视图
@model OverviewVM
@Html.EditorFor(model => model.TimeAxis)
当我执行GET请求时,查询字符串是TimeAxis.From=22.+02.+2014&TimeAxis.To=25.+02.+2014,但是一旦在操作TimeAxis.From和 TimeAxis.To 都是空的。
如果我将表单方法更改为 POST,它会立即按预期工作。从设计的角度来看,这应该/必须是GET请求。
任何想法如何使模型绑定适用于 GET?
更新:
将操作更改为
public ActionResult Overview(DateTime? From = null, DateTime? To = null)
并以以下形式发送请求:.../概述/?From=22.+02.+2014&To=25.+02.+2014 也可以。
但我想将其封装在类中,不需要更改输入字段名称 - EditorFor 将它们生成为 TimeAxis.From 和 TimeAxis.To。我可能会向视图模型/窗体添加其他属性。
我找到了答案。HTTP GET请求是文化不变的,而HTTP POST请求尊重MVC ASP.NET 当前文化。
http://weblogs.asp.net/melvynharbour/archive/2008/11/21/mvc-modelbinder-and-localization.aspx
如果要将模型再次引入视图,则需要将模型视图传递回视图,例如
return View(TimeAxis);
那么,我认为您没有一个名为Controller
的控制器,是吗?你可能有HomeController
或其他东西,不是吗?
在这种情况下,请将您的表格修改为
@using (Html.BeginForm("Overview", "Home", FormMethod.Get))
例如,如果您正在Overview
操作在Home
控制器中
总而言之,您的控制器和视图应该是:
public ActionResult Overview(TimeAxisVM TimeAxis)
{
return View(TimeAxis);
}
和
@using (Html.BeginForm("Overview", "Home", FormMethod.Get))
{
@Html.EditorFor(Model => Model.From)
@Html.EditorFor(Model => Model.To)
<button type="submit">Submit</button>
}
以下是上述代码的截屏视频:http://screencast.com/t/7G6ofEq0vZEo
完整来源: http://ge.tt/1Uh80pK1/v/0?c