加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 08:07:22 所属栏目:百科 来源:网络整理
导读:我想为DateTime创建一个编辑器模板,我需要3个独立的字段: (DropDown) Day | (DropDown) Month | (DropDown) Year 我如何以及在何处创建此文件?当我发布到控制器时,我需要做什么才能将这3个字段转换为单个DateTime? 解决方法 在Views / Shared / EditorTem
我想为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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读