Пользовательская сводка проверки ASP.NET MVC для полей адреса
Я пытаюсь найти лучший способ проверить оформление заказа на одной странице. Это содержит:
- адрес корабля
- Платежный адрес
- и т.п.
Класс 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 ответов
Вы можете использовать составное свойство 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)
{
...
}
}
}
Я столкнулся с подобной проблемой в недавнем проекте, я сделал пользовательскую сводку проверки, вот код:
<%
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.
Внутри вы можете проверить наличие особых и уникальных требований. Надеюсь, поможет.
IDataErrorInfo состоит из двух членов:
- Ошибка - Получает сообщение об ошибке, указывающее, что не так с этим объектом.
- Item - получает сообщение об ошибке для свойства с указанным именем.
Если вы реализуете Error member, у вас будет одно сообщение об ошибке.
Вот что я бы сделал:
Поместите свои ошибки валидации в 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>
<% } %>
Это решение выделит конкретные поля, которые пользователь неправильно заполнил, и отобразит краткое описание ошибок, которые вы хотите.
Скотту только что выпустил отличный пост в блоге о новых функциях проверки.
Хотя в нем не рассказывается о том, как реализовать проверку на уровне модели, он указывает на шаблон проекта приложения ASP.NET MVC 2 по умолчанию в качестве объяснения того, как это сделать:
Помимо создания атрибутов проверки, которые применяются к отдельным свойствам объекта, вы также можете применять атрибуты проверки на уровне класса, что позволяет выполнять логику проверки для нескольких свойств внутри объекта. Для примера этого в действии вы можете просмотреть пользовательский атрибут "PropertiesMustMatchAttribute", который включен в файл AccountModels.cs/vb в шаблоне проекта приложения ASP.NET MVC 2 по умолчанию (просто выполните File->New ASP.NET MVC 2 Web Project в рамках VS 2010 и ищите этот класс).