как переопределить «Требуется значение». при проверке формата даты и времени в виде asp.net MVC? - PullRequest
4 голосов
/ 02 апреля 2009

Я проверяю поле даты и времени в представлении mvc для формата даты и времени, например:

        If contactToValidate.LastUpdated = Nothing OrElse Not IsDate(contactToValidate.LastUpdated) OrElse CType(contactToValidate.LastUpdated, DateTime) = DateTime.MinValue Then
             _validationDictionary.AddError("AddErrorValue", "Date Format is not Correct!")
        End If

но, если ввод для LastUpdated в View оставлен пустым, кроме моей собственной ошибки («Формат даты не верный!»), Отображается сообщение об ошибке по умолчанию: Требуется значение. Я считаю, что это то, что mvc framework автоматически проверяет на конвертирование типов данных, но, поскольку я проверяю текстовое поле LastUpdated на наличие нулевого и даты-формата, я не хочу, чтобы это сообщение об ошибке отображалось. Я просто хочу свой собственный. Как я могу это сделать? Спасибо

Ответы [ 7 ]

5 голосов
/ 02 апреля 2009

Вы, вероятно, получаете это сообщение, потому что поле даты привязано к необнуляемому DateTime в вашей модели презентации. Если вы измените тип этого поля или свойства на значение DateTime со значением NULL, вы больше не должны получать это сообщение.

В любом случае вы можете настроить сообщение, которое видит пользователь, внедрив IDataErrorInfo в вашей модели презентации.

4 голосов
/ 10 декабря 2009

К сожалению, независимо от того, куда вы смотрите, большинство ответов на этот вопрос - «Реализация IDataErrorInfo!».

Эта же проблема появляется, если вы попытаетесь, например, ввести текстовую строку в поле текстового поля, привязанное к целочисленному свойству. Проще говоря, если MVC не может преобразовать пользовательское значение в правильный тип, он генерирует эти (совершенно бесполезные) общие ошибки и никогда не вызывает членов IDataErrorInfo.

Определенно трудно переопределить эти бесполезные сообщения, и лично я считаю, что лучший ответ - просто реализовать некоторую проверку на стороне клиента для обработки этих сценариев. Случаи, когда он генерирует эти сообщения, очень последовательны и легко предсказуемы:

  • Пользователь не указал значение для необнуляемого поля
  • Пользователь ввел или выбрал значение, которое не может быть преобразовано в базовый тип (например: текст в числовое поле)

Кроме того, проверка на стороне клиента в любом случае является хорошей практикой. Если у пользователя не включен javascript, то он наверняка сможет выяснить проблему в любом случае, если вы используете Html.ValidationMessage () и / или стилизуете поля ввода для выявления проблем.

3 голосов
/ 12 ноября 2009

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

Способ, который я обошел, состоит в том, чтобы очистить информацию об ошибках в ModelState. В моем обработчике исключений на моем методе контроллера я делаю это:

foreach (var state in ModelState.Values)
{
  if (state.Errors.Count > 0) 
    state.Errors.Clear();
}

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

3 голосов
/ 30 июня 2009

Я пытался внедрить IDataErrorInfo в свои частичные классы, но я все еще получил мошенническое сообщение об ошибке «Требуется значение» для выпадающих списков, в которых ничего не выбрано, т. Е. Возвращать ноль, а не целое число для внешнего ключа. *

Я сделал это в первой строке моего действия Create:

public ActionResult Create([Bind(Exclude="Id")]MyEntity myEntityToCreate)
{
    foreach (string key in ModelState.Keys)
    {
        ModelState[key].Errors.Clear();
}

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

Вероятно, это не лучший способ сделать это.

1 голос
/ 08 марта 2010

Если вы хотите исключить свойство из проверки, то лучший способ сделать это, если вы используете привязку модели, тогда вы хотите:

public ActionResult Create([Bind(Exclude="LastUpdated")] Contact contactToValidate)
{

}

если вы используете UpdateModel или TryUpdateModel, вы можете использовать:

string prefix = string.Empty;
string[] includedProperties = new string[0];
string[] excludedProperties = new [] { "LastUpdated" };

TryUpdateModel<Contact>(contactToValidate, prefix, includedProperties, excludedProperties);

Обратите внимание, что поскольку вы отправляете пустой массив для включенных свойств, вы фактически включаете ВСЕ свойства, и одно исключенное свойство затем берется из этого набора.

0 голосов
/ 31 января 2011

Я знаю, что это немного поздно. Но реальная проблема заключается в наличии свойства с именем "Id" в модели привязки. Просто переименуйте все поля «Id» в EntityId или что-то в этом роде. И MVC не будет автоматически проверять поле.

0 голосов
/ 02 апреля 2009

Я верю, что вы ищете это

ViewData.ModelState.AddModelError("FieldName", "Date Format is not Correct!");

Это заставит <%=Html.ValidationMessage("FieldName") %> показать ваше сообщение об ошибке.

Редактировать: Я только что проверил, и это на самом деле не решит проблему. Вы должны обратиться к Craig Stuntz ответу о ненулевом типе и IDataErrorInfo , а затем вы можете добавить собственное сообщение об ошибке для пустого поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...