Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 如何使用单个属性中的所有验证属性序列化模型?_Json_Asp.net Mvc 3_Serialization_Json.net_Validationattribute - Fatal编程技术网

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

Json 如何使用单个属性中的所有验证属性序列化模型?,json,asp.net-mvc-3,serialization,json.net,validationattribute,Json,Asp.net Mvc 3,Serialization,Json.net,Validationattribute,上下文:使用mvc控制器方法创建jsonP服务,该方法提供包括所有验证规则的formfields定义 我的问题是我不知道如何序列化验证属性。我更喜欢与Razor在常规Mvc视图中使用不引人注目的验证时序列化的格式相同的验证属性 为了序列化为json,我使用NewtonSoft.json(4.0.2) 模型示例: 公共班级简介{ [Required(ErrorMessage="This field is required.")] [StringLength(25, ErrorMes

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

我的问题是我不知道如何序列化验证属性。我更喜欢与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." }]}

非常感谢任何帮助或指针。

这将基于数据注释属性为给定属性构造一个具有验证属性的字典:

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));
    }
}
var metadata=modelmataproviders.Current.GetMetadataForProperty(null,typeof(MyModel),“MyProperty”);
var validationRules=metadata.GetValidators(ControllerContext).SelectMany(v=>v.GetClientValidationRules());
var validationAttributes=新字典();
foreach(validationRules中的ModelClientValidationRule规则)
{
string key=“data val-”+rule.ValidationType;
validationAttributes.Add(key,HttpUtility.HtmlEncode(rule.ErrorMessage??string.Empty));
键=键+“-”;
foreach(rule.ValidationParameters中的KeyValuePair对)
{
validationAttributes.Add(key+pair.key,
HttpUtility.htmlAttributeNCode(
pair.Value!=null?Convert.ToString(pair.Value,CultureInfo.InvariantCulture):string.Empty);
}
}

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

在提出此问题时,这可能不存在,但现在有一种更新的方法将验证作为字典进行:

@Html.GetUnobtrusiveValidationAttributes("FieldName")



更新:当需要验证时,我无法返回一些字段的空集,因此我实际上选择了接受的解决方案。

谢谢,这正是我想要的。对Web Api 2有什么建议吗?