Как сериализовать модель со всеми атрибутами проверки из отдельных свойств? - PullRequest
6 голосов
/ 20 июня 2011

Контекст: создание службы 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." }]}

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

Ответы [ 2 ]

9 голосов
/ 20 июня 2011

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

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.

0 голосов
/ 22 мая 2018

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

@Html.GetUnobtrusiveValidationAttributes("FieldName")

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


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...