c# – 如何使用3个字段为DateTime创建编辑器模板?

前端之家收集整理的这篇文章主要介绍了c# – 如何使用3个字段为DateTime创建编辑器模板?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想为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”> < /脚本&GT)

如果这是不可接受的,你将不得不看@Jon指出的Custom ModelBinders.

原文链接:https://www.f2er.com/csharp/100791.html

猜你在找的C#相关文章