我想为DateTime创建一个编辑器模板,我需要3个独立的字段:
(DropDown) Day | (DropDown) Month | (DropDown) Year
我如何以及在何处创建此文件?当我发布到控制器时,我需要做什么才能将这3个字段转换为单个DateTime?
解决方法
在Views / Shared / EditorTemplates文件夹中,创建一个名为DateTime.ascx的局部视图.
这个EditorTemplate的代码应该是这样的
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<DateTime?>" %> <% string controlId = ViewData.TemplateInfo.HtmlFieldPrefix.Replace('.','_'); %> <script type="text/javascript"> $(function () { $('#<%: controlId %>_Day,#<%: controlId %>_Month,#<%: controlId %>_Year').live('change',function () { updateHiddenDate('<%: controlId %>'); }); $('#<%: controlId %>_Day').val('<%: Model.HasValue ? Model.Value.Day.ToString() : "" %>'); $('#<%: controlId %>_Month').val('<%: Model.HasValue ? Model.Value.Month.ToString() : "" %>'); $('#<%: controlId %>_Year').val('<%: Model.HasValue ? Model.Value.Year.ToString() : "" %>'); updateHiddenDate('<%: controlId %>'); }); function updateHiddenDate(hiddenDateId) { $('#' + hiddenDateId).val($('#' + hiddenDateId + '_Year').val() + "-" + $('#' + hiddenDateId + '_Month').val() + "-" + $('#' + hiddenDateId + '_Day').val()); } </script> <select id="<%: controlId %>_Day"> <% for (int dayOrdinal = 1; dayOrdinal <= 31; dayOrdinal++) { Response.Write(string.Format("<option value=\"{0}\">{0}</option>",dayOrdinal)); } %> </select> <select id="<%: controlId %>_Month"> <% for (int monthOrdinal = 1; monthOrdinal <= 12; monthOrdinal++) { Response.Write(string.Format("<option value=\"{0}\">{1}</option>",monthOrdinal,System.Globalization.DateTimeFormatInfo.CurrentInfo.MonthNames[monthOrdinal - 1])); } %> </select> <select id="<%: controlId %>_Year"> <% for (int yearOrdinal = DateTime.Now.Year - 5; yearOrdinal <= DateTime.Now.Year + 5; yearOrdinal++) { Response.Write(string.Format("<option value=\"{0}\">{0}</option>",yearOrdinal)); } %> </select> <%: Html.Hidden("",Model.HasValue ? String.Format("{0:yyyy-MM-dd}",Model) : "") %>
这将创建一个带有隐藏字段的编辑器模板,其中包含MVC ModelBinder可以解析的日期的ISO 8601表示.
每当下拉列表发生变化时,jQuery都会更新隐藏字段.请注意我使用ViewData.TemplateInfo.HtmlFieldPrefix来获取隐藏字段的生成ID.
请注意,此解决方案很容易实现,而不需要使用Custom ModelBinder,因为我们构造了一个包含完整日期时间的表单值.但是,这确实意味着
>您依赖于启用了javascript的客户端,以及
>您需要在母版页中包含对jQuery库的脚本引用(例如< script type =“text / javascript”src =“../../ Scripts / jquery-1.4.1.min.js”> < /脚本>)
如果这是不可接受的,你将不得不看@Jon指出的Custom ModelBinders.