Как я могу предотвратить создание атрибута проверки? - PullRequest
20 голосов
/ 18 ноября 2011

У меня есть свойство DateTime в моей модели, но меня интересует только часть времени:

public class MyModel
{
    [Required, DataType.Time]
    public DateTime Time
}

На мой взгляд, я вывожу это так:

@Html.EditorFor(model => model.Time)

Используется для генерации следующего HTML-кода в MVC 3:

<input class="text-box single-line" data-val="true" 
    data-val-required="The Time field is required." 
    id="Time" name="Time" type="time" value="" />

Теперь я пытаюсь это с MVC 4, и это сгенерированный HTML:

<input class="text-box single-line" data-val="true" 
    data-val-date="The field Time must be a date." 
    data-val-required="The Time field is required." 
    id="Time" name="Time" type="time" value="" />

Добавлен дополнительный атрибут data-val-date, который приводит к ошибке проверки на стороне клиента, поскольку время (например, "10:30") не форматируется как дата.

Полагаю, это ошибка в MVC 4 ( Я сообщил об этом )? Но пока он не решен, есть ли способ предотвратить создание этого атрибута? Или, что еще лучше, есть ли способ позволить ему генерироваться вместо data-val-time, чтобы я мог предоставить собственный метод проверки на стороне клиента для полей времени?

Ответы [ 5 ]

4 голосов
/ 05 декабря 2011

Не идеально, но это сделает работу;используйте JavaScript в своем основном шаблоне, чтобы удалить проверку:

$(document).ready(function(){
    $("input[data-val-date]").removeAttr("data-val-date");
});
3 голосов
/ 24 февраля 2013

Используйте [DataType ("Time")] вместо [DataType (DataType.DateTime)]. Это заставит MVC не обрабатывать вашу переменную как DateTime, а затем не будет генерировать атрибут «data-val-date».

По существу [DataType ("Time")] делает вашу переменную настраиваемым типом. Однако вы не можете использовать любое другое имя строки для пользовательского типа. MVC пытается определить базовый тип для пользовательского типа. Только когда вы назовете свой пользовательский тип как «Время», он откажется от обнаружения.

2 голосов
/ 18 ноября 2011

Могу сказать, что лучшим вариантом будет написать собственную функцию проверки на стороне клиента.В противном случае вы можете сделать некоторую подделку, что я не скажу, что это правильный путь, но это может решить вашу проблему.У меня была похожая проблема с проверкой MVC, когда я хотел изменить поведение проверки на стороне клиента.См. Ссылку

Проверка Asp.net MVC3

Идея в том, что вы вручную добавляете такие атрибуты, как «data-val-required» и «data-val»в поле ввода, а затем добавьте для него сообщение проверки.

Надеюсь, оно вам как-то поможет.

Редактировать:

Попробуйте это

Удалите обязательное поле attr из модели

public class MyModel
{    
    public DateTime Time
}

Затем добавьте атрибуты к вашему элементу управления, как показано ниже

    @Html.TextBoxFor(model => model.Time, new Dictionary<string, object> { { "data-val-required", "required" }, { "data-val", "true" }})
    @Html.ValidationMessage("Time", "The Time field is required.")
1 голос
/ 05 мая 2015

Лучший способ - установить ClientValidationEnabled и UnobtrusiveJavaScriptEnabled в false в классе HtmlHelper .

HtmlHelper.ClientValidationEnabled = false;
HtmlHelper.UnobtrusiveJavaScriptEnabled = false;
1 голос
/ 03 апреля 2012

Я попытался установить значение поля ввода как объект даты javascript, который, в свою очередь, прошел проверку ненавязчивой проверки.

$("#date-input-field").val(new Date(1,0,1970));
$.validator.unobtrusive.parse('#form');
var form = $('#form');
form.validate();

Это делается с помощью проверки jQuery 1.7.2.ненавязчивый и mvc4.

Надеюсь, это поможет.

...