ASP.Net MVC 3 - ненавязчивая проверка на стороне клиента для шаблонов редактора

Я новичок в ASP.Net MVC 3, столкнулся с некоторыми проблемами при попытке реализовать ненавязчивую проверку на стороне клиента для шаблона редактора, который я создал для отображения даты в индивидуальном порядке.

Пользовательский интерфейс
Мне нужно отображать дату в формате трех texbox UI как

enter image description here


Я установил 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>

Модель
] Мне нужно привязать поле «Дата рождения», которое является свойством подобъекта моей модели, к этому свойству, в этой структуре

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;
    }
    ...
}

. Я пытаюсь передать имена элементов текстовых полей дня, месяца и года здесь в элементы проверки на стороне клиента,так что позже я напишу метод проверки jquery на стороне клиента и адаптер, который будет использовать эти элементы и выполнять проверку на стороне клиента.

View
Теперь, чтобы использовать этот шаблон редактора, я вставил 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 в представление как ссылки

Вопросы

  1. Это не вызывает ненавязчивых атрибутов проверки javascript в html, хотя я реализовал IClientValidatable .Я вставил в представление следующие строки

    @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 в представление в виде ссылок

    Вопросы

    1. Это не выводит ненавязчивые атрибуты проверки javascript в html, хотя я реализовали IClientValidatable .Я вставил в представление следующие строки

      @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 в представление в виде ссылок

      Вопросы

      1. Это не выводит ненавязчивые атрибуты проверки javascript в html, хотя я реализовали IClientValidatable . В целях тестирования, когда я помещаю тот же атрибут ( DateTimeClientValidation ) в другое свойство в модели, в которой не использовался этот шаблон редактора, он выдавал эти атрибуты проверки, а не только для этого редактора. шаблон. Где я мог ошибиться?
      2. Что касается диапазона сообщений проверки для шаблона редактора, правильно ли я помещаю его только в режим просмотра или мне следует поместить его непосредственно в шаблон редактора ( @ Html.ValidationMessageFor (m = > m.MySubModel.DateofBirth) )
      3. В этом примере я прав в дизайне, я вставил DateTimeClientValidationAttribute , который на самом деле является атрибутом, который я использовал для модели, но этот компонент немного знает о пользовательском интерфейсе (поскольку он пытается передать клиенту имя элементов Day, Month и Year), это позволяет модели немного узнать о представлении, нарушаю ли я здесь какие-либо принципы проектирования?
      4. В DateTimeClientValidationAttribute я пытаюсь передать клиенту имена элементов дня, месяца и года, чтобы клиентский скрипт может выполнять на нем проверки. Но поскольку свойство модели DateofBirth находится в подобъекте, фактическое имя элемента в сценарии - MySubObject.DateOfBirth , что делает имя текстового поля Day равным MySubObject.DateofBirth. День , как мне найти это полное название модели в методе GetClientValidationRules , чтобы я мог выдать имя клиенту?

      Спасибо за терпение, чтобы прочитать все это, и для ответов

7
задан Shravan 1 April 2011 в 08:47
поделиться