ValidationSummary отображает дубликаты сообщений - PullRequest
3 голосов
/ 14 октября 2011

Если два текстовых поля не проходят проверку одновременно, ValumationSummary отображает одно и то же сообщение дважды.

Я что-то не так делаю?Или есть параметр, который я могу изменить, чтобы скрыть дубликаты сообщений?

Я разбил его на простейший пример:

Просмотр:

@model MyModel
@Html.ValidationSummary()
@Html.TextBoxFor(model => model.A)
@Html.TextBoxFor(model => model.B)

Модель:

public class MyModel : IValidatableObject
{
    public int A { get; set; }
    public int B { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        //Some logic goes here.        
        yield return new ValidationResult("Validation failed", new[] { "A", "B" });
    }
}

Результат:

enter image description here

Ответы [ 3 ]

8 голосов
/ 14 октября 2011

Они не являются дубликатами с точки зрения ValidationSummary - вы присваиваете ошибку состояния модели обоим полям A и B, поэтому в сводке проверки должно быть 2 ошибки.Он не «знает», что они одинаковы.

Простые решения:

  • назначить модель только одной из них
  • исключить ошибки из назначенных свойств из сводки - Html.ValidationSummary (true)

Немного более сложное решение:

  • создайте свой собственный помощник ValidationSummary, вызовите в нем стандартную сводную логику проверки, а затем отфильтруйте результат «выбрать различный» способ (linq - ваш друг здесь).

РЕДАКТИРОВАТЬ:

примерно так, например:

public static class ValidationExtensions
{
    public static MvcHtmlString FilteredValidationSummary(this HtmlHelper html)
    {
        // do some filtering on html.ViewData.ModelState 
        return System.Web.Mvc.Html.ValidationExtensions.ValidationSummary(html);
    }
}
2 голосов
/ 24 апреля 2012

Ударить это ваш взгляд

<ul class="validation-summary-errors">
    @{
        string errorMessage = "", previousError = "";
        foreach (ModelState modelState in (ViewContext.ViewData.ModelState.Values)){

            foreach (ModelError modelError in modelState.Errors)
            {
                errorMessage = modelError.ErrorMessage;
                if (errorMessage != previousError)
                {
                    <li>@modelError.ErrorMessage</li>
                    previousError = modelError.ErrorMessage;
                }                            
            }    
        }
    }
</ul>

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

1 голос
/ 14 октября 2011

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

Вы можете: 1) Использовать другое сообщение для полей A и B

// logic here
yield return new ValidationResult("Validation failed for left field", new[] { "A" });
// logic here
yield return new ValidationResult("Validation failed for right field", new[] { "B" });

или, по вашему мнению

2) Вызовите ValidationSummary с аргументом excludePropertyErrors, установленным в значение true - ValidationSummary(true).И поместите вызов Html.ValidationMessage[For] рядом с каждым из ваших полей.

UPDT: ... и третий случай:

В вашей модели добавьте общее сообщение (на уровне модели):

//logic here
yield return new ValidationResult("Validation failed");
yield return new ValidationResult("any text or empty string", new[] { "A", "B" });

По вашему мнению исключите сообщения свойств, но не добавляйте ValidationMessage для полей:

@model MyModel
@Html.ValidationSummary(true)
@Html.TextBoxFor(model => model.A)
@Html.TextBoxFor(model => model.B)

Таким образом, вы получите одно сообщение и оба красных поля.

...