6

次のカスタム RegularExpressionAttribute を作成しました

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class AlphaNumericAttribute: RegularExpressionAttribute, IClientValidatable
{
    public AlphaNumericAttribute()
      : base("^[-A-Za-z0-9]+$")
    {
    }

   public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
   {
      yield return new ModelClientValidationRule { ErrorMessage =  FormatErrorMessage(metadata.GetDisplayName()), ValidationType = "alphanumeric" };
   }
}

ViewModel のフィールドは、AlphaNumeric 属性で装飾されています。

[AlphaNumeric(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = Resources.DriverLicenseNumber_RegexError_)]
public string DriverLicenseNumber { get; set; }

フィールドはビューに組み込まれています。

@using (Html.BeginForm("Index", "Application", FormMethod.Post, new { id = "applicationDataForm", autocomplete = "off" }))
{
    @Html.LabelFor(m => m.DriverLicenseNumber)
    @Html.ValidationMessageFor(m => m.DriverLicenseNumber)
    @Html.TextBoxFor(m => m.DriverLicenseNumber)
}

これにより、html 入力タグに適切な「data-」検証属性が生成されます。ただし、レンダリングされたタグは次のようになります。

<input data-val="true" data-val-alphanumeric="Please enter a valid driver's license number." id="DriverLicenseNumber" name="DriverLicenseNumber" type="text" value="" maxlength="20" class="valid">

レンダリングされるはず のdata-val-regexおよびdata-val-regex-pattern属性が著しく欠けています。

jqueryマスキングを使用してマスクされた入力のマスクされたスペースを処理するこのSSN検証のように、まったく同じ構造を持つ他のバリデーターを構築しました。

public class SsnAttribute : RegularExpressionAttribute, IClientValidatable
{
  public SsnAttribute()
  : base("^([0-9]{3}–[0-9]{2}–[0-9]{4})|([ ]{3}–[ ]{2}–[ ]{4})|([0-9]{9,9})$")
{
}

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
  yield return new ModelClientValidationRule { ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()), ValidationType = "ssn" };
}

}

ViewModel に付属のアプリケーションを使用すると、次のようになります。

[Ssn(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = Resources.SocialSecurity_RegexError_)]
public new string SocialSecurityNumber { get; set; }

フィールドはビューに組み込まれています。

@using (Html.BeginForm("Index", "Application", FormMethod.Post, new { id = "applicationDataForm", autocomplete = "off" }))
{
    @Html.LabelFor(m => m.SocialSecurityNumber)
    @Html.ValidationMessageFor(m => m.SocialSecurityNumber)
    @Html.TextBoxFor(m => m.SocialSecurityNumber)
}

この検証属性は、data-val-regex および data-val-regex-pattern 属性を正しくレンダリングします。

<input class="SSNMask valid" data-val="true" data-val-regex="Please enter a valid social security number." data-val-regex-pattern="^([0-9]{3}–[0-9]{2}–[0-9]{4})|([ ]{3}–[ ]{2}–[ ]{4})|([0-9]{9,9})$" id="SocialSecurityNumber" name="SocialSecurityNumber" type="text" value="" maxlength="22">



適切な html 属性をレンダリングしないという AlphaNumeric 属性で何が欠けているのかわかりません。

4

2 に答える 2

10

の場合の問題は、バリデーターのタイプにAlphaNumericAttributeJavaScript アダプターを追加していないことだと思います。alphanumeric

コードには次のようなものがあります。

$.validator.unobtrusive.adapters.add('ssn', function(options) { /*...*/ });

上記のコードは、 のクライアント側アダプタを宣言していますSsnAttribute。のプロパティにssn設定されている名前と同じであることに注意してください。ValidationTypeModelClientValidationRule

問題を解決するには、ケースに必要なすべてのセットアップが既にあるため (つまり、既存のアダプター)、AlphaNumericAttribute返品する必要があります。ModelClientValidationRegexRuleregex

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class AlphaNumericAttribute : RegularExpressionAttribute, IClientValidatable
{
    public AlphaNumericAttribute()
        : base("^[-A-Za-z0-9]+$")
    {
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRegexRule(FormatErrorMessage(metadata.GetDisplayName()), Pattern);
    }
}

ただし、正規表現検証の背後にあるクライアント側に追加のロジックが必要な場合は、独自の控えめなアダプターを作成して登録する必要があります。

より大きなイメージを取得し、ASP.NET MVC でカスタム検証を実装する方法をよりよく理解するには、Brad Wilson のUnobtrusive Client Validation in ASP.NET MVC 3のブログ投稿を参照してください。セクションを参照してくださいCustom adapters for unusual validators

于 2013-08-04T09:29:41.237 に答える
1

これは、MVC のカスタム検証属性を作成する方法からの別のアプローチです。これは、 ASP.NET MVC カスタム検証に関するこの記事から採用されています。

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class AlphaNumericAttribute: RegularExpressionAttribute
{
    private const string pattern = "^[-A-Za-z0-9]+$";

    public AlphaNumericAttribute() : base(pattern)
    {
        // necessary to enable client side validation
        DataAnnotationsModelValidatorProvider.RegisterAdapter(
            typeof(AlphaNumericAttribute), 
            typeof(RegularExpressionAttributeAdapter));
    }
}

を使用RegisterAdapterすることで、独自の継承された型の正規表現用に既に存在する統合を活用できます。

于 2015-01-21T01:56:46.307 に答える