2009-11-29 4 views
4

Я пытаюсь найти лучший способ проверить проверку на одну страницу. Он содержит:Пользовательская сводка валидации ASP.NET MVC для полей адреса

  • адрес корабля
  • платежный адрес
  • т.д.

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

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

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

Так что я хочу, чтобы показать сводку как:

"Your shipping address is incomplete" 

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

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

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


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

ValidationSummary now supports overloads where only model-level errors are displayed. This is useful if you are displaying validation messages inline next to each form field. Previously, these messages would be duplicated in the validation summary. With these new changes, you can have the summary display an overall validation message (ex. “There were errors in your form submission”) as well as a list of validation messages which don’t apply to a specific field.

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

ответ

1

IDataErrorInfo имеет два члена:

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

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

+0

, но затем отдельные поля не выделяются. я не хочу потерять эту визуальную подсказку - тем более что не все поля действительно требуются (например, Address2) –

+0

@Simon: Если вы хотите, чтобы поле было выделено, вы можете добавить пустую ошибку: 'if (String.IsNullOrEmpty (адрес.Zip)) ModelState.AddModelError ("Zip", ""); 'Он не будет отображаться в сводке проверки. – LukLed

1

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

<% 
     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 Helper, так же, как оригинальный ValidationSummary.

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

+0

Вы делали группировку, о которой я говорю? я предполагаю, что могу делать ошибки, я не хочу отображать только «*» в сообщении об ошибке и фильтровать их в этом списке. –

+0

Я не публиковал полный код, потому что его собственный источник, но в пределах foreach вы можете проверить этот конкретный случай, проверьте, не являются ли эти свойства Street1, Street2, City, State пустыми, а затем пропустите их конкретные сообщения, просто отправьте их, как «Ваш адрес доставки неполный», вы все равно сможете выделить каждое отдельное поле, потому что у моделиState все еще есть определенные элементы с ошибками, но отображение сообщений будет всего одним. – JOBG

+0

Я признаю, что это похоже на быстрый, не ремонтируемый и грязный способ, но если вы в спешке, он просто работает =). Если время не является проблемой, взгляните на IDataErrorInfo. – JOBG

1

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

Поставь ошибки проверки в 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> 
<% } %> 

Это решение выделить определенные поля, которые пользователь неправильно заполненные и отображать краткое описание ошибок, как вы хотите.

3

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

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) 
     { 
      ... 
     } 
    } 
} 
+0

Раньше не просматривал ValidationAttribute. Спасибо - http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validationattribute.aspx –

+0

Наличие выделенного класса Address может иметь дополнительные преимущества.Например, вы можете переопределить ToString() или поместить на него метод Format(), чтобы отобразить адрес во время подтверждения. Кроме того, он многократно используется для поля адреса BillTo. Надеюсь, поможет! –

+0

wierd - он не позволит мне принять ваш ответ (или любой из них) –

0

ScottGu только что выпустила great blog post on the new validation features ,

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

In addition to creating validation attributes that apply to individual properties on an object, you can also apply validation attributes at the class level – which allows you to perform validation logic across multiple properties within an object. For an example of this in action, you can review the “PropertiesMustMatchAttribute” custom attribute that is included in the AccountModels.cs/vb file within the default ASP.NET MVC 2 application project template (just do a File->New ASP.NET MVC 2 Web Project within VS 2010 and look for this class).

Смежные вопросы