我想为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,因为我们构造了一个包含完整日期时间的表单值。但是,这确实意味着
<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/