Настраиваемая сводка проверки ASP.NET MVC для адресных полей - PullRequest
4 голосов
/ 29 ноября 2009

Я пытаюсь найти наилучший способ проверки одностраничной проверки. Содержит:

  • адрес корабля
  • адрес для выставления счета
  • и т.д.

Класс Address явно содержит First Name, Last Name, Street1, Street2, City, State, Zip, Phone и т. Д.

Допустим, пользователь нажимает «ОК» перед тем, как что-либо вводить, и в результате вы получаете дюжину или более ошибок проверки, которые дают вам большой блок красного текста, который выглядит просто некрасиво.

Я хотел бы проверить адрес как единое целое и выдать интеллектуальную ошибку - например, «неполный адрес» или более конкретные ошибки, когда это необходимо. Но я все еще хочу иметь возможность выделить каждую отдельную область, которая имеет проблемы. Я не вижу простого способа сделать это прямо сейчас, потому что, очевидно, помощник Html.ValidationSummary покажет все поля.

Итак, я хочу показать резюме как:

 "Your shipping address is incomplete"

и выделите красным Zip и City.

Я думаю, что мне нужно было бы сделать полностью пользовательскую ValidationSummary, а может быть, даже полностью пользовательскую структуру данных.

Делают ли какие-либо структуры проверки правильности такое резюме, где резюме должно показывать интеллектуальное резюме, а не только каждую отдельную ошибку поля.


Редактировать: MVC 2 RC теперь поддерживает ошибки на уровне модели.

ValidationSummary теперь поддерживает перегрузки, где только уровень модели ошибки отображаются. Это полезно если вы показываете проверку сообщения, встроенные рядом с каждой формой поле. Ранее эти сообщения будет дублироваться в валидации резюме. С этими новыми изменениями вы может иметь резюме отображать общее сообщение проверки (например, «Там были ошибки в представлении вашей формы ») а также список проверки сообщения, которые не относятся к конкретное поле.

Кто-нибудь получил пример того, как это сделать?

Ответы [ 5 ]

3 голосов
/ 29 декабря 2009

Вы можете использовать составное свойство Address и проверить весь адрес как единое целое:

public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
    public string Zip { get; set; }
}

public class Order
{
    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }

    [AddressRequired("Your shipping address is incomplete")]
    public Address ShipTo { get; set; }

    [AddressRequired("Your billing address is incomplete")]
    public Address BillTo { get; set; }

    // you could do this if you still need 1:1 mapping for model binding
    public string ShippingCity
    {
        get { return ShipTo.City; }
        set { ShipTo.City = value; }
    }
}

И атрибут проверки будет выглядеть примерно так:

public class AddressRequiredAttribute : ValidationAttribute
{
    ...

    public override bool IsValid(object value)
    {
        var address = value as Address;

        if (address != null)
        {
            ...
        }
    }
}
1 голос
/ 29 ноября 2009

Я столкнулся с подобной проблемой в недавнем проекте, я сделал пользовательскую сводку проверки, вот код:

<%
      if (!ViewData.ModelState.IsValid)
       {
           Response.Write("<div class=\"prepend-1 span-10 last notice\">");
           Response.Write("<span>Please fix fields marked with an asteristk <span class=\"ss_sprite ss_asterisk_orange\"> </span></span>");
           Response.Write("<ul>");
           foreach (KeyValuePair<string, ModelState> keyValuePair in ViewData.ModelState)
           {
               foreach (ModelError modelError in keyValuePair.Value.Errors)
               {
                %>
                <li><%= Html.Encode(modelError.ErrorMessage)%></li>
                <%
       }
           } Response.Write("</ul>");
           Response.Write("</div>");
       }
    %> 

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

Внутри вы можете проверить любые специальные и уникальные требования. Надеюсь, это поможет.

1 голос
/ 25 декабря 2009

Вот что я бы сделал:

Поместите ваши ошибки валидации в ModelState любым удобным для вас способом. Вы можете добавить их непосредственно в ModelState в своем контроллере, используя IDataErrorInfo, или с DataAnnotations и средством проверки. На самом деле это не имеет значения, пока вы заполняете ModelState ошибками и повторно отображаете представление.

Затем убедитесь, что все ваши входы также имеют соответствующий Html.ValidationMessage (), связанный с ними в вашей форме:

<%= Html.TextBox("city") %>
<%= Html.ValidationMessage("city", "*") %>

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

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

<% if (!ViewData.ModelState.IsValid) { %>
    <div id="validation-message">Your Shipping Address in Incomplete</div>
<% } %>

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

1 голос
/ 29 ноября 2009

IDataErrorInfo состоит из двух членов:

  • Ошибка - Получает сообщение об ошибке, указывающее, что не так с этим объектом.
  • Item - получает сообщение об ошибке для свойства с указанным именем.

Если вы внедрите элемент Error, у вас будет одно сообщение об ошибке.

0 голосов
/ 17 января 2010

Скотту только что выпустил отличное сообщение в блоге о новых функциях проверки .

Хотя в нем не рассказывается о том, как реализовать проверку на уровне модели, он указывает на шаблон проекта приложения ASP.NET MVC 2 по умолчанию в качестве объяснения того, как это сделать:

В дополнение к созданию проверки атрибуты, которые относятся к индивидуальным свойства объекта вы также можете применить атрибуты проверки на уровень класса - который позволяет выполнить проверку логики через несколько свойств внутри объекта. Для примера этого в действии вы можно просмотреть «PropertiesMustMatchAttribute» пользовательский атрибут, который включен в Файл AccountModels.cs / vb в пределах приложение ASP.NET MVC 2 по умолчанию шаблон проекта (просто сделайте Файл-> Новый ASP.NET MVC 2 веб-проект в рамках VS 2010 и ищите этот класс).

...