6

コンテキスト:すべての検証ルールを含むフォームフィールドの定義を提供するmvcコントローラメソッドを使用してjsonPサービスを作成する。個々のプロパティからすべての検証属性を使用してモデルをシリアル化する方法はありますか?

私の問題は、検証属性をシリアル化する方法がわかりません。私は通常のMvcビューで控えめな検証を使用するときにRazorによって直列化されるのと同じフォーマットで検証属性を優先します。

jsonにシリアル化するには、NewtonSoft.Json(4.0.2)を使用します。モデルの

例: パブリッククラスプロファイル{好ましいシリアル化するJavaScriptの

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

例:

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

任意のヘルプまたはポインタが非常に高く評価されています。

答えて

7

検証がデータ注釈に基づいて、指定されたプロパティの属性を持つ。これは、辞書を構築します属性:

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辞書をシリアル化する必要があります。

+0

ありがとう、これは私が探していたものです。 – bees73

+0

Web Api 2の提案はありますか? – JenonD