我想为DateTime创建一个编辑器模板,我需要3个单独的字段:

(DropDown) Day    |    (DropDown) Month    |    (DropDown) Year

如何以及在何处创建此文件?当我发布到 Controller 时,该怎么做才能将这3个字段转换为一个DateTime

最佳答案

Views/Shared/EditorTemplates文件夹中,创建一个名为DateTime.ascx的局部 View 。

此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 ModelBinders,因为我们构造了一个包含完整日期时间的表单值。但是,这确实意味着
  • 您依靠启用了javascript的客户端以及
  • 您需要在母版页中包含对jQuery库的脚本引用(例如<script type="text/javascript" src="../../Scripts/jquery-1.4.1.min.js"></script>)

  • 如果这是 Not Acceptable ,则必须按照@Jon的说明查看Custom ModelBinders。

    关于c# - 如何为带有3个字段的DateTime创建编辑器模板?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6693119/

    10-15 01:51
    查看更多