Получить атрибуты проверки в шаблоне редактора MVC3 - PullRequest
3 голосов
/ 22 января 2012

Я пишу шаблон редактора для ввода даты и времени, который состоит из трех полей.

  • Текстовое поле с датщиком jQuery UI.
  • Текстовое поле для ввода времени.
  • Скрытый ввод, который обновляется с использованием полной строки даты и времени через javascript.

Идея состоит в том, чтобы отображать пользователю отдельные поля для даты и времени, при этом только одно поле связано с моделью. Всякий раз, когда отображаемые поля изменяются, скрытое поле обновляется с помощью JavaScript.

@model System.DateTime?
<span class="datetime-editor">
<input class="datepicker" value="@(Model.HasValue ? 
  Model.Value.Date.ToString() : string.Empty)" readonly="readonly"/>
<input class="time" value="@(Model.HasValue ? 
  Model.Value.TimeOfDay.ToString() : string.Empty)"/>
@Html.HiddenFor(d => d)</span>

JavaScript для настройки средства выбора даты и копирования значений в скрытое поле.

$(".datepicker").datepicker();
$(".datetime-editor").find("input").change(function () {
    var date = $(this).parent().find(".datepicker").val();
    var time = parseTime($(this).parent().find(".time").val());
    if (date != "" && time != null) {
        $(this).siblings(".datetime-result").val(date + " " + time);
    }
    else {
        $(this).siblings(".datetime-result").val("");
    }
});

Моя проблема в атрибутах проверки. Все они присутствуют в скрытом теге ввода:

<input name="StartDateTime" id="StartDateTime" type="hidden" 
  data-val-required="Start date and time are required" data-val="true" value=""/>

Я бы хотел как-то захватить сгенерированные атрибуты data-val* и добавить их вместо видимых входных данных. Через ViewData.ModelMetaData я могу узнать, является ли поле обязательным или нет, но тогда мне придется заново изобрести логику, чтобы создать атрибут data-val-required. Вместо этого я хотел бы получить сгенерированные атрибуты.

Ответы [ 3 ]

14 голосов
/ 22 января 2012

Вы могли бы использовать помощник HTML для генерации этих входных данных, если вы хотите, чтобы данные HTML5 * проверяли атрибуты на них:

@{
    var validationAttributes = Html.GetUnobtrusiveValidationAttributes("");
}
@Html.TextBox(
    "", 
    Model.HasValue ? Model.Value.Date.ToString() : string.Empty, 
    new RouteValueDictionary(validationAttributes) 
    { 
        { "class", "datepicker" }, 
        { "readonly", "readonly" } 
    }
)

@Html.TextBox(
    "", 
    Model.HasValue ? Model.Value.TimeOfDay.ToString() : string.Empty, 
    new RouteValueDictionary(validationAttributes) 
    { 
        { "class", "time" } 
    }
)
1 голос
/ 25 апреля 2013

Я пытался сделать что-то подобное;IDE действительно вводит вас в заблуждение.

Если вы хотите узнать, требуется ли свойство в модели, вы иногда спрашиваете не об атрибуте [Required], а о том, имеет ли он значение Nullable.Например:

public class MyModel
{
    public int Number1 { get; set; }
    public int? Number2 { get; set; }
}

Оба они будут использовать EditorTemplates \ Int32.cshtml

В шаблоне вашего редактора вы можете использовать:

@model System.Int32?
<input id=@Html.IdForModel() @(Model is Nullable ? "" : "required") />

Обратите внимание, что знак вопросапосле @model System.Int32 (делает его обнуляемым) необходимо, если вы не хотите, чтобы IDE жаловалась при проверке is Nullable.

0 голосов
/ 26 июля 2013

Вы должны зарегистрировать адаптер для обеспечения проверки на стороне клиента: http://msdn.microsoft.com/en-us/library/system.web.mvc.dataannotationsmodelvalidatorprovider.registeradapter(v=vs.98).aspx

...