将datetime分解为ASP.NET MVC表单的组成部分

时间:2010-05-24 10:26:30

标签: asp.net-mvc datetime forms modelbinders html-helper

我已经无情地搜索了网络并且没有找到任何东西 - 这是令人惊讶的,因为我认为这是一种常见的情况!

基本上,在我的模型上,我有一个DateTime字段,我希望用户填写表单。我正在使用Html帮助器来呈现表单的所有其他部分(以及验证)

所以这个问题分为两部分......

Html Helper

首先,有没有办法使用Html帮助器将DateTime字段拆分为日期的三个组成部分:日,月,年(因为我不关心时间部分) )。这可以呈现为文本框,下拉列表或两者的组合。

模型绑定

然后在发布表单时,绑定到模型的最佳方法是什么?我已经看到Scott Hanselmann's solution了,但是对于我需要的东西似乎有点臃肿 - 我希望有一个更优雅的解决方案。是否建议扩展DefaultModelBinder并将其设置为默认绑定器(因为所有日期都将以这种方式处理)或编写实现IModelBionder的类并将其设置为{{1的默认绑定器输入?

感谢所有的帮助提前:-)我喜欢MVC,但令我愤怒的是,一些如此微不足道的事情引起了如此多的麻烦!

1 个答案:

答案 0 :(得分:1)

我认为我已经找到了一个合适的解决方案,所以我会为任何偶然发现这个问题的人提供答案!

关于Html助手,我不知何故完全忽略了创建扩展方法!所以最终当它发生在我身上时,我写了一个扩展方法,基本上调用Html帮助器的其他方法来提供三个字段(无论你使用下拉文本输入是你的选择)

    public static string DateTime(this HtmlHelper helper, string name)
    {
        StringBuilder builder = new StringBuilder();
        string dayName = name + ".Day";
        string monthName = name + ".Month";
        string yearName = name + ".Year";

        builder.Append(helper.TextBox(dayName));
        builder.Append(helper.DropDownList(monthName, typeof (Months)));
        builder.Append(helper.TextBox(yearName));

        return builder.ToString();
    }

对于表单发布后的绑定,我只创建了一个实现IModelBinder的类,并在应用程序启动时将其设置为DateTime类型的默认值。如果需要不同的绑定方法,则可以在控制器操作级别覆盖此值。这本质上是斯科特的一个简单版本的粘合剂,我在我的问题中将其链接起来。

此刻就像一个魅力(如果有点过分简单),但我相信这对于任何对这个问题感到困惑的人来说都足够了!