1

控えめなAJAXフォームを介してMVC3でクライアント側の検証を実装しようとしています。

    public class PhoneNumberAttribute : RegularExpressionAttribute, IClientValidatable
{
    private const string Message = " must be a valid phone number";
    public PhoneNumberAttribute()
        : base(@"^[\s\d\+\(\)]+$")
    {
        ErrorMessage = "{0}" + Message;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        return new List<ModelClientValidationRule>() {
            new ModelClientValidationRule{
                ValidationType="phonenumber",
                  ErrorMessage= metadata.DisplayName + " " + Message
            } 
        };
    }
}

モデル:

 public class MyModel
{
    [DisplayName("Phone Number")]        
    [PhoneNumber]
    public string PhoneNumber{ get; set; }
 }

HTML

 <% using (Ajax.BeginForm("Contact", new AjaxOptions() { UpdateTargetId = "ajaxcontactform", 
     OnBegin = "ShowProcessing", 
     OnComplete = "HideProessing",
     InsertionMode = InsertionMode.Replace
 }))
 {%>
           <%: Html.ValidationSummary()%>

 <%: Html.TextBoxFor(m => m.PhoneNumber, new { Class = "contacttextform" })%>
 <input id="sendBtn" name="send" type="submit" class="contactformbutton" value="Send" />
<%}%>

[Required]属性とカスタム検証属性を持つフィールドに必要な.jsファイルとその他のクライアント側の検証作業を含めました。

PhoneNumberフィールドで機能しない理由を教えてください。

ありがとう、

4

1 に答える 1

0

C# コードは検証の片側にすぎません。そこで行うことは、検証を実行するメタデータを定義することだけです。また、控えめな JavaScript を使用して検証を登録する必要があります。JavaScript については、を参照してください。

コレクションの控えめな検証

http://odetocode.com/Blogs/scott/archive/2011/02/22/custom-data-annotation-validator-part-ii-client-code.aspx

編集 それを見て、あなたがこれを考えすぎているのではないかと思います。IClientValidatableすべての操作が から継承されているため、 が必要な理由がまったくわかりませんRegularExpressionAttribute。以下を試してください。

public class PhoneNumberAttribute : RegularExpressionAttribute
{
    private const string Message = " must be a valid phone number";
    public PhoneNumberAttribute()
        : base(@"^[\s\d\+\(\)]+$")
    {
        ErrorMessage = "{0}" + Message;
    }


}
于 2012-11-01T14:24:22.387 に答える