HTTP GET中的MVC5 ViewModel绑定



我有这样的动作

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

相关内容

  • 没有找到相关文章

最新更新