如何使用各个属性中的所有验证属性序列化模型?

时间:2011-06-20 14:00:16

标签: json asp.net-mvc-3 serialization json.net validationattribute

上下文:使用mvc控制器方法创建jsonP服务,该方法提供包含所有验证规则的表单域的定义。

我的问题是我不知道如何序列化验证属性。在常规Mvc视图中使用不显眼的验证时,我更喜欢与Razor序列化的格式相同的验证属性。

为了序列化为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 个答案:

答案 0 :(得分:9)

这将根据数据注释属性构建一个包含给定属性的验证属性的字典:

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));
    }
}

然后,您应该在自定义JSON序列化代码中使用您的属性序列化validationAttributes字典。

答案 1 :(得分:0)

这个问题在这个问题上可能并不存在,但是现在有一种更新的方式来验证字典:

@Html.GetUnobtrusiveValidationAttributes("FieldName")

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

更新:当我应该进行验证时,我遇到了为某些字段返回空集的问题,所以我实际上已经接受了已接受的解决方案。