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

本文关键字:绑定 问题 模型 默认 net mvc asp | 更新日期: 2023-09-27 17:58:03

我有一个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查询参数转换为可为null的DateTime(在此上下文中为null,表示所有日期或没有过滤器)。

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

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

为什么DateTime很麻烦,有什么建议吗?

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

Veli是对的。如果你想使用日期格式,你需要为你的DateTime定制一个模型活页夹。看看这里:

如何指定模型绑定的日期格式?

您可以使用将新路由添加到路由表中

routes.MapRoute(
"SearchRoute", 
"{controller}/{action}/{id}",
new {controller = "Home", action = "Index", reportedDate = UrlParameter.Optional} 
);

那么你的url就会变成

MyController/Search/30-05-2011

这将使您的控制器动作捕捉到报告日期的值

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

好吧,问题是毕竟日期格式,看起来预期的日期格式字符串是mm/dd/yyyy,而日期是以dd/mm/yyyy 形式出现的