Я новичок в ASP.Net MVC 3, столкнулся с некоторыми проблемами при попытке реализовать ненавязчивую проверку на стороне клиента для шаблона редактора, который я создал для отображения даты в произвольном порядке.
UI
Мне нужно показать дату в трех текстовом интерфейсе в формате
Я выставил EditorTemplate для отображения даты в трех частях как
@model DateTime?
<table class="datetime">
<tr>
<td>@Html.TextBox("Day", (Model.HasValue ? Model.Value.ToString("dd") : string.Empty)) </td>
<td class="separator">/</td>
<td>@Html.TextBox("Month", (Model.HasValue ? Model.Value.ToString("MM") : string.Empty))</td>
<td class="separator">/</td>
<td>@Html.TextBox("Year", (Model.HasValue ? Model.Value.ToString("yyyy") : string.Empty))</td>
</tr>
<tr>
<td class="label">dd</td>
<td/>
<td class="label">mm</td>
<td/>
<td class="label">yyyy</td>
</tr>
</table>
Модель Я должен связать поле Date of Birth, которое является свойством в подобъекте моей модели, с этим свойством, в этой структуре
MyModel
--> MySubModel
--> DateOfBirth
public class MySubModel
{
...
[DataType(DataType.Date)]
[Display(Name = "Date of birth")]
[DateTimeClientValidation()]
public DateTime DateofBirth { get; set; }
...
}
Проверка на стороне клиента
Я создал пользовательский атрибут проверки, который реализует IClientValidatable как
public class DateTimeClientValidationAttribute : ValidationAttribute, IClientValidatable
{
...
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
List<ModelClientValidationRule> clientRules = new List<ModelClientValidationRule>();
//Combined date should be valid
ModelClientValidationRule validDateRule = new ModelClientValidationRule
{
ErrorMessage = "Please enter a valid date.",
ValidationType = "validdate"
};
validDateRule.ValidationParameters.Add("dayelement", metadata.PropertyName + ".Day");
validDateRule.ValidationParameters.Add("monthelement", metadata.PropertyName + ".Month");
validDateRule.ValidationParameters.Add("yearelement", metadata.PropertyName + ".Year");
clientRules.Add(validDateRule);
return clientRules;
}
...
}
Я пытаюсь передать имена элементов текстовых полей Day, Month & Year здесь элементам проверки на стороне клиента, поэтомупозже я напишу метод проверки подлинности jquery и адаптер на стороне клиента, которые будут использовать эти элементы и выполнять проверку на стороне клиента.
View Теперь, чтобы использовать этот шаблон редактора, я вставил Представление в следующие строки
@model MyModel
...
<tr>
<td class="editor-label">
@Html.LabelFor(m => m.MySubModel.DateofBirth)
</td>
<td class="editor-field">
@Html.EditorFor(m => m.MySubModel.DateofBirth)
@Html.ValidationMessageFor(m => m.MySubModel.DateofBirth)
</td>
</tr>
...
Добавил все соответствующие файлы проверки jquery в представлении в качестве ссылок
Вопросы
- Это не выводит ненавязчивые атрибуты проверки JavaScript в html, хотя я реализовал IClientValidatable .В целях тестирования, когда я помещаю тот же атрибут ( DateTimeClientValidation ) в другое свойство в модели, которая не использует этот шаблон редактора, он выводит эти атрибуты проверки, он не выводит его только для этого редактора.шаблон.Где я мог ошибиться?
- Относительно диапазона сообщения проверки для шаблона редактора, правильно ли, что я помещаю его только в представление или я должен поместить его непосредственно в шаблон редактора (@Html.ValidationMessageFor(m => m.MySubModel.DateofBirth) )
- В этом примере я прав в дизайне, я вставил DateTimeClientValidationAttribute , который на самом деле является атрибутом, который я поставилна модели, но этот компонент немного знает об интерфейсе пользователя (так как он пытается выдать клиенту имя элемента Day, Month & Year), это делает Model немного знакомым с View, нарушаю ли я какие-либо принципы проектирования здесь?
- В DateTimeClientValidationAttribute я пытаюсь передать клиенту имена элементов дня, месяца и года, чтобы клиентский скрипт мог выполнить проверки на нем.Но поскольку свойство модели DateofBirth находится в подобъекте, фактическое имя элемента в скрипте равно MySubObject.DateOfBirth , что делает имя текстового поля Day равным MySubObject.DateofBirth.День , как мне найти это полное имя модели в методе GetClientValidationRules , чтобы я мог передать имя клиенту?
Спасибо за терпениезачитать все это и за ответы