【问题标题】:asp.net mvc: default model binder problemasp.net mvc:默认模型绑定器问题
【发布时间】:2011-05-30 14:38:40
【问题描述】:

我有一个 MVC 3 视图,它显示可以按日期过滤的项目列表。

过滤器是一个文本框,它已被 jQueryUI 填充到日期选择器中。

查看:

<%= Html.TextBoxFor(model => model.ReportedDate, new { @class = "datepicker" })%>

脚本:

$(".datepicker").datepicker({
        dateFormat: 'dd/mm/yy',
        changeYear: true,
        changeMonth: true
});

单击按钮后,我获取文本框的值并将其作为 GET 请求的查询字符串参数发送到我的控制器操作:

MyController/Search?reportedDate=30/05/2011

控制器动作:

public ActionResult Search(DateTime? reportedDate)

据此,我希望默认模型绑定器将 reportedDate 查询参数转换为可为空的 DateTime(在此上下文中为空,表示所有日期或无过滤器)。

然而事实并非如此。 reportedDate 始终为空。我可以深入了解Request.QueryString 并使用DateTime.TryParse 手动进行转换,这是我目前的工作,但我不明白为什么它首先会失败。

客户端和服务器之间的日期格式没有区别,还有其他数据类型(字符串和整数)的过滤参数(此处省略,但在实际代码中存在),它们可以毫无问题地处理。

关于 DateTime 麻烦的任何建议?

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    维利是对的。如果您想使用该日期格式,则需要为您的 DateTime 自定义模型绑定器。看这里:

    How to specify date format for model binding?

    【讨论】:

      【解决方案2】:

      您可以使用

      向路由表添加新路由
      routes.MapRoute(
      "SearchRoute", 
      "{controller}/{action}/{id}",
      new {controller = "Home", action = "Index", reportedDate = UrlParameter.Optional} 
      );
      

      那么你的网址就会变成

      MyController/Search/30-05-2011
      

      这将使您的控制器操作捕获报告日期的值

      但您必须更改您在日期选择器中使用的日期格式

      【讨论】:

        【解决方案3】:

        对,问题毕竟日期格式,看起来预期的日期格式字符串是mm/dd/yyyy,而日期是dd/mm/yyyy

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-07
          • 1970-01-01
          • 2016-03-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多