Проверка Asp.net MVC. Как указать несколько проверочных сообщений для одного поля в поле зрения - PullRequest
1 голос
/ 16 февраля 2012

У меня есть FormModel, как это:

public class Model
{   
    [Required]
    [StringLength(10)]
    public string Name { get; set; }
}

Я хочу указать 2 разных сообщения для RequiredAttribute и StringLengthAttribute. Я не хочу указывать свои сообщения об ошибках в атрибутах проверки. Я хочу указать их на мой взгляд. Но, на мой взгляд, я могу сделать только что-то вроде этого:

@Html.TextBoxFor(x => x.Name)
@Html.ValidationMessageFor(x => x.Name, "validation error")  

Кто-нибудь сталкивался с этой проблемой? Заранее спасибо ....

1 Ответ

3 голосов
/ 16 февраля 2012

Нет встроенного способа сделать это.Насколько я помню, он был намеренно оставлен разработчиками MVC, потому что они полагали, что это приведет к загроможденному пользовательскому интерфейсу.Также вводится вопрос «Как бы вы хотели, чтобы они выводились?

Так что вам нужно было бы создать свой собственный вспомогательный метод, который может легко основываться на ValidationMessageFor, например - объединить все ошибкисообщения, разделенные запятыми (непроверенные, только для концепции):

public static class ValidationHelpers
{
    public static MvcHtmlString MultiValidationMessageFor<TModel, TProperty>(
       this HtmlHelper<TModel> htmlHelper, 
       Expression<Func<TModel, TProperty>> expression, 
       object htmlAttributes = null
       )
    {
        var propertyName = ModelMetadata.FromLambdaExpression(
                              expression, htmlHelper.ViewData).PropertyName;
        var modelState = htmlHelper.ViewData.ModelState;

        if (modelState.ContainsKey(propertyName) && 
            modelState[propertyName].Errors.Count > 1)
        {
            // We have multiple error messages

            string messages = String.Join(", ", 
               modelState[propertyName].Errors.Select(e => e.ErrorMessage)
            );

            // Reuse the built-in helper that takes a string as the message:
            return htmlHelper.ValidationMessageFor(
               expression, 
               messages, 
               htmlAttributes as IDictionary<string, object> ?? htmlAttributes
            );
        }

        // We only have a single message, so just call the standard helper
        return htmlHelper.ValidationMessageFor(
           expression, 
           null, 
           htmlAttributes as IDictionary<string, object> ?? htmlAttributes
        );
    }
}

Или вы можете сделать полное сообщение проверки <span> для каждого (также непроверенного):

// Only the multiple error case changes from the version above:

if (modelState.ContainsKey(propertyName) && 
   modelState[propertyName].Errors.Count > 1)
{
   StringBuilder builder = new StringBuilder();

   // Build a complete validation message for each message
   foreach (ModelError error in modelState[propertyName].Errors)
   {
      builder.Append(
         htmlHelper.ValidationMessageFor(
            expression, error.ErrorMessage, htmlAttributes
         )
      );
   }

   return MvcHtmlString.Create(builder.ToString());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...