Как указать порядок ошибок аннотации данных в Html.ValidationSummary - PullRequest
3 голосов
/ 12 октября 2010

Я отображаю ошибки в моей форме с использованием

<%= Html.ValidationSummary("Please review the errors below") %>

Мой объект домена наследуется от базового класса, и я обнаружил, что свойства аннотации данных базового класса отображаются в нижней частисписок.Это идет вразрез с порядком их появления в моей форме.

Можно ли указать порядок отображения ошибок?

Пример:

public class ClassA { [Required]public string AProperty; }
public class ClassB : ClassA { [Required]public string BProperty; }

Моя форма (строго типизированное представление ClassB):

AProperty: <%= Html.TextBoxFor(m => m.AProperty) %>
BProperty: <%= Html.TextBoxFor(m => m.BProperty) %>

Ошибки проверки отображаются как:

The BProperty is required.
The AProperty is required.

Ответы [ 4 ]

2 голосов
/ 23 декабря 2011

Я написал расширение для этого:

public static void OrderByKeys(this ModelStateDictionary modelStateDictionary, IEnumerable<string> keys)
{
    ModelStateDictionary result = new ModelStateDictionary();
    foreach (string key in keys)
    {
        if (modelStateDictionary.ContainsKey(key) && !result.ContainsKey(key))
        {
            result.Add(key, modelStateDictionary[key]);
        }
    }
    foreach (string key in modelStateDictionary.Keys)
    {
        if (!result.ContainsKey(key))
        {
            result.Add(key, modelStateDictionary[key]);
        }
    }
    modelStateDictionary.Clear();
    modelStateDictionary.Merge(result);
}

, которое вы можете использовать:

ModelState.OrderByKeys(new[] { "AProperty", "BProperty" });
0 голосов
/ 12 сентября 2013

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

using System.Linq;
using System.Web.Mvc;

namespace 
{
    public class OrderedModelStateAttribute : FilterAttribute, IActionFilter
    {
        public void OnActionExecuted(ActionExecutedContext filterContext)
        {
            var modelState = filterContext.Controller.ViewData.ModelState;
            var orderedModelState = new ModelStateDictionary();

            foreach (var key in filterContext.HttpContext.Request.Form.Keys.Cast<string>()
                                             .Where(
                                                 key =>
                                                 modelState.ContainsKey(key) && !orderedModelState.ContainsKey(key)))
            {
                orderedModelState.Add(key, modelState[key]);
            }

            foreach (var key in modelState.Keys.Where(key => !orderedModelState.ContainsKey(key)))
            {
                orderedModelState.Add(key, modelState[key]);
            }

            modelState.Clear();
            modelState.Merge(orderedModelState);
        }

        public void OnActionExecuting(ActionExecutingContext filterContext)
        {
        }
    }
}

Используйте следующий код, чтобы добавить фильтр ко всем действиям: filters.Add(new OrderedModelStateAttribute());

0 голосов
/ 12 октября 2010

Я не уверен, что мой ответ правильный или неправильный, вы можете попробовать этот способ.

   public ActionResult yourAction(your params)
    { 
           if (!ModelState.IsValid)
            {
                var errs = from er in tmpErrs
                           orderby er.Key
                           select er;

                ModelState.Clear();

                foreach (var err in errs)
                {
                    ModelState.Add(err);
                }
            }
    // your code 

    }
0 голосов
/ 12 октября 2010

Неа.Отражение используется для получения всех аннотаций данных, и они всегда отображаются в том порядке, в котором свойства отображаются при вызове typeof(MagicSocks).GetTYpe().GetProperties().В вашем случае я почти уверен, что свойства производного класса всегда будут появляться перед свойствами базового типа.

Вы должны написать свой собственный помощник и наши собственные атрибуты для отображения ошибок проверки в выбранном вами порядке.

...