Сводка проверки для наборов

Править: обновленный этот вопрос MVC 2.0
С asp.net MVC 2.0 там существующий метод создания Сводки Проверки, которая имеет смысл для моделей, содержащих наборы? Если не я могу создать свою собственную сводку проверки

Модель в качестве примера:

public class GroupDetailsViewModel
{
    public string GroupName { get; set; }
    public int NumberOfPeople { get; set; }
    public List<Person> People{ get; set; }
}

public class Person
{
    [Required(ErrorMessage = "Please enter your Email Address")]
    [RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", ErrorMessage = "Please enter a valid Email Address")]
    public string EmailAddress { get; set; }

    [Required(ErrorMessage = "Please enter your Phone Number")]
    public string Phone { get; set; }

    [Required(ErrorMessage = "Please enter your First Name")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Please enter your Last Name")]
    public string LastName { get; set; }
}

Существующая сводка <%=Html.ValidationSummary %> если ничто не вводится, похож на это.

Следующая ошибка (ошибки) должна быть исправлена прежде, чем продолжиться к следующему шагу
* введите свой Адрес электронной почты
* введите свой Номер телефона
* введите свое Имя
* введите свою Фамилию
* введите свой Адрес электронной почты
* введите свой Номер телефона
* введите свое Имя
* введите свою Фамилию

Дизайн призывает, чтобы заголовки были вставлены как это:

Следующая ошибка (ошибки) должна быть исправлена прежде, чем продолжиться к следующему шагу
Человек 1
* введите свой Адрес электронной почты
* введите свой Номер телефона
* введите свое Имя
* введите свою Фамилию
Человек 2
* введите свой Адрес электронной почты
* введите свой Номер телефона
* введите свое Имя
* введите свою Фамилию

Ответ На основе ответа Pharcyde.

public static MvcHtmlString NestedValidationSummary(this HtmlHelper helper)
{
    if (helper.ViewData.ModelState.IsValid)
        return MvcHtmlString.Empty;

    // create datastructure to group error messages under a given key (blank key is for general errors)
    var errors = new Dictionary<string,List<string>>();
    foreach (KeyValuePair<string, ModelState> keyPair in helper.ViewData.ModelState)
    {
        foreach (ModelError error in keyPair.Value.Errors)
        {
            //determine the 'key' for the group in which this error belongs
            var key = keyPair.Key.Split(']')[0];
            if (key.Contains("People["))
                key = "Person " + key.Split('[')[1];
            else
                key = string.Empty;

            if(!errors.ContainsKey(key))
                errors.Add(key,new List<string>());
            //now add message using error.ErrorMessage property
            errors[key].Add(error.ErrorMessage);
        }
    }

    // generate the HTML
    var ul = new TagBuilder("ul");
    foreach (KeyValuePair<string, List<string>> errorPair in errors.OrderBy(p=>p.Key))
    {
        var li = new TagBuilder("li");
        if(!string.IsNullOrEmpty(errorPair.Key))
            li.InnerHtml += string.Format("<p class=\"no-bottom-margin\"><strong>{0}</strong></p>",errorPair.Key);
        var innerUl = new TagBuilder("ul");
        foreach (var message in errorPair.Value)
        {
            var innerLi = new TagBuilder("li");
            innerLi.InnerHtml = message;
            innerUl.InnerHtml += innerLi.ToString(TagRenderMode.Normal);
        }
        li.InnerHtml += innerUl.ToString(TagRenderMode.Normal);
        ul.InnerHtml += li.ToString(TagRenderMode.Normal);
    }

    return MvcHtmlString.Create(ul.ToString(TagRenderMode.Normal));
}
6
задан Myster 8 August 2010 в 23:25
поделиться