6

コンテキスト: すべての検証ルールを含むフォームフィールドの定義を提供する mvc コントローラー メソッドを使用して jsonP サービスを作成します。

私の問題は、検証属性をシリアル化する方法がわからないことです。通常の Mvc ビューで目立たない検証を使用する場合、Razor によってシリアル化されるのと同じ形式の検証属性を好みます。

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

モデルの例: public class Profile{

    [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." }]}

ヘルプやポインタは大歓迎です。

4

2 に答える 2

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 ディクショナリをシリアル化する必要があります。

于 2011-06-20T15:36:29.960 に答える