asp.net mvc:默认模型绑定器问题

时间:2011-05-30 14:38:40

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

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

过滤器是一个文本框,已经jQueryUI-fiied到日期选择器。

查看:

<%= 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(在此上下文中为null,表示所有日期或无过滤器)。

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

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

为什么DateTime很麻烦?

3 个答案:

答案 0 :(得分:3)

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

How to specify date format for model binding?

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以使用

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

然后您的网址将变为

MyController/Search/30-05-2011

将使您的控制器操作捕获到reportedDate的值

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