HTTP GET中的MVC5 ViewModel绑定?

时间:2014-02-23 05:34:47

标签: asp.net-mvc razor internationalization model-binding

我有这样的行动

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&amp; TimeAxis.To = 25. + 02. + 2014但是一次在动作TimeAxis.From和TimeAxis.To都是空的。

如果我将表单方法更改为POST,它会立即按预期工作。从设计的角度来看,这应该是/必须是GET请求。

如何让模型绑定为GET工作?

更新:

将操作更改为

public ActionResult Overview(DateTime? From = null, DateTime? To = null)

以这种形式发送请求:... / Overview /?From = 22. + 02. + 2014&amp; To = 25. + 02. + 2014也适用。

但是我想将它封装在类中并且不需要更改输入字段名称 - EditorFor将它们生成为TimeAxis.From和TimeAxis.To。我可能会向ViewModel / form添加其他属性。

2 个答案:

答案 0 :(得分:2)

我找到了答案。 HTTP GET请求是文化不变的,而HTTP POST请求则遵循ASP.NET MVC中的当前文化。

http://weblogs.asp.net/melvynharbour/archive/2008/11/21/mvc-modelbinder-and-localization.aspx

答案 1 :(得分:0)

如果要再次将Model带入视图,则需要将ModelView传递回View

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>
}

{{1}}

这是上面代码的截屏视频:http://screencast.com/t/7G6ofEq0vZEo

完整来源:http://ge.tt/1Uh80pK1/v/0?c