2

プロジェクトを MVC3 から MVC4 にアップグレードしたところ、バリデーターの 1 つがトリガーされなくなっていることに気付きました。サイト全体でさまざまな形式で社会保障番号を取得するために使用される Shared/EditorTemplates フォルダー内のカスタム DataType まで追跡しました。(正規表現を説明するために、保存後にページが読み込まれるときに最後の 4 桁のみを表示します。)

SSN.cshtml

@{
    var ssn = (string)ViewData.TemplateInfo.FormattedModelValue;
    if (!String.IsNullOrWhiteSpace(ssn)){
        ssn = "###-##-" + Model.Substring(Model.Length - 4, 4);
    }
}
@Html.TextBox("", ssn, new { @class = "text-box single-line ssn", pattern = @"^(\d{3}|###)-(\d{2}|##)-\d{4}$", placeholder = "###-##-####", title = "Expected pattern is ###-##-####" })

MVC4 では、目立たない検証では、data-val-regex-patternだけでなく、表示されたテキスト ボックスの属性としてpatternを探しているようです。誰もこれに遭遇したことがありますか?

注: カスタム データ型の検証を維持したいので、各モデルに追加することを常に覚えておく必要はありません。

ありがとう!

4

2 に答える 2

2

独自のカスタム バリデータを作成して、モデル プロパティに配置できます。ここに例があります

public class SocialSecurityAttribute : RegularExpressionAttribute
{
    public SocialSecurityAttribute () : base(@"^(\d{3}|###)-(\d{2}|##)-\d{4}$") { }
}

次に、グローバル asax.cs アプリケーションの開始に次のように登録します。

  DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(SocialSecurityAttribute), typeof(RegularExpressionAttributeAdapter));

使用すると、他の組み込み属性と同じになります

[SocialSecurity(ErrorMessage ...)]
public string SocialSecurityNumber{get;set;}

コードを再利用できるので、このように実装するのが好きです。それ以外の場合は、正規表現を渡す RegularExpressionAttribute を使用できます

于 2013-05-01T18:06:48.297 に答える
1

MVC4 が正しいデータ属性を入力フィールドにレンダリングできるようにするには、TextBox ヘルパーに渡される匿名オブジェクトのハイフンをアンダースコアに置き換える必要があることがわかりました。これが私が最終的に得たコードです:

SSN.cshtml

@{
    var ssn = (string)ViewData.TemplateInfo.FormattedModelValue;
    if (!String.IsNullOrWhiteSpace(ssn) && ssn.Length == 11)
    {
        ssn = "###-##-" + Model.Substring(Model.Length - 4, 4);
    }
    else {
        ssn = "";
    }
}
@Html.TextBox("", ssn,
    new
    {
        @class = "text-box single-line ssn",
        data_val = "true",
        data_val_regex_pattern = @"^(\d{3}|###)-(\d{2}|##)-\d{4}$",
        data_val_regex = "Expected pattern is ###-##-####",
        placeholder = "###-##-####"
    }
)
于 2013-05-02T14:55:06.463 に答える