В вашей папке 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) : "") %>
, который создает шаблон редактора со скрытымполе, содержащее представление ISO 8601 даты, которую MVC ModelBinder может проанализировать.
jQuery обновляет скрытое поле при каждом изменении раскрывающихся списков.Обратите внимание на использование ViewData.TemplateInfo.HtmlFieldPrefix
, которое я использую для получения сгенерированного id
скрытого поля.
Обратите внимание , что это решение легко внедряется, не обращая внимания на Custom ModelBinders, потому что мысоздать единственное значение формы, содержащее полную дату и время.Тем не менее, это означает, что
- Вы полагаетесь на клиент с включенным javascript, и
- Вам необходимо включить ссылку на скрипт на библиотеку jQuery на главной странице (например,
<script type="text/javascript" src="../../Scripts/jquery-1.4.1.min.js"></script>
)
Если это не приемлемо, вам придется посмотреть на Custom ModelBinders, как указывал @Jon.