Как сериализовать модель со всеми атрибутами проверки из отдельных свойств?

Контекст: создание сервиса jsonP с методами контроллера mvc, который предоставляет определение полей формы, включая все правила проверки.

Моя проблема в том, что я не знаю, как сериализовать атрибуты проверки. Я предпочитаю атрибуты проверки в том же формате, поскольку они сериализуются Razor при использовании ненавязчивой проверки в обычных представлениях Mvc.

Для сериализации в json я использую NewtonSoft.Json (4.0.2).

Пример модели: профиль открытого класса{

    [Required(ErrorMessage="This field is required.")]
    [StringLength(25, ErrorMessage="Max 25 chars.")]
    public string Firstname{get;set;}
    }

Пример предпочтительного сериализованного javascript:

     {"Firstname": "John", 
      "ValidationRules":[{"data-val-required":"This field is required.", "data-val-length-max":25, "data-val-length":"Max 25 chars." }]}

Любая помощь или указатели очень ценятся.


person bees73    schedule 20.06.2011    source источник


Ответы (2)


Это создаст словарь с атрибутами проверки для данного свойства на основе атрибутов аннотаций данных:

var metadata = ModelMetadataProviders.Current.GetMetadataForProperty(null, typeof(MyModel), "MyProperty");
var validationRules = metadata.GetValidators(ControllerContext).SelectMany(v => v.GetClientValidationRules());
var validationAttributes = new Dictionary<string, string>();

foreach (ModelClientValidationRule rule in validationRules)
{
    string key = "data-val-" + rule.ValidationType;
    validationAttributes.Add(key, HttpUtility.HtmlEncode(rule.ErrorMessage ?? string.Empty));
    key = key + "-";
    foreach (KeyValuePair<string, object> pair in rule.ValidationParameters)
    {
        validationAttributes.Add(key + pair.Key,
            HttpUtility.HtmlAttributeEncode(
                pair.Value != null ? Convert.ToString(pair.Value, CultureInfo.InvariantCulture) : string.Empty));
    }
}

Затем вы должны сериализовать словарь validationAttributes с вашим свойством в вашем пользовательском коде сериализации JSON.

person Tz_    schedule 20.06.2011
comment
Спасибо, это было именно то, что я искал. - person bees73; 22.06.2011
comment
любое предложение для Web Api 2? - person JenonD; 11.03.2016

Этого, вероятно, не существовало во время этого вопроса, но теперь есть обновленный способ получения проверки в виде словаря:

@Html.GetUnobtrusiveValidationAttributes("FieldName")

https://msdn.microsoft.com/en-us/library/system.web.mvc.htmlhelper.getunobtrusivevalidationattributes(v=vs.108).aspx


ОБНОВЛЕНИЕ: у меня возникли проблемы с возвратом пустого набора для некоторых полей, когда должна быть проверка, поэтому я фактически выбрал принятое решение.

person bradlis7    schedule 22.05.2018