我已经无情地搜索了网络并且没有找到任何东西 - 这是令人惊讶的,因为我认为这是一种常见的情况!
基本上,在我的模型上,我有一个DateTime
字段,我希望用户填写表单。我正在使用Html帮助器来呈现表单的所有其他部分(以及验证)
所以这个问题分为两部分......
首先,有没有办法使用Html帮助器将DateTime
字段拆分为日期的三个组成部分:日,月,年(因为我不关心时间部分) )。这可以呈现为文本框,下拉列表或两者的组合。
然后在发布表单时,绑定到模型的最佳方法是什么?我已经看到Scott Hanselmann's solution了,但是对于我需要的东西似乎有点臃肿 - 我希望有一个更优雅的解决方案。是否建议扩展DefaultModelBinder
并将其设置为默认绑定器(因为所有日期都将以这种方式处理)或编写实现IModelBionder
的类并将其设置为{{1的默认绑定器输入?
感谢所有的帮助提前:-)我喜欢MVC,但令我愤怒的是,一些如此微不足道的事情引起了如此多的麻烦!
答案 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
类型的默认值。如果需要不同的绑定方法,则可以在控制器操作级别覆盖此值。这本质上是斯科特的一个简单版本的粘合剂,我在我的问题中将其链接起来。
此刻就像一个魅力(如果有点过分简单),但我相信这对于任何对这个问题感到困惑的人来说都足够了!