0

カスタム検証属性を作成しました

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
    public sealed class ValidateDublicateNameAttribute : ValidationAttribute, IClientValidatable
    {
        private const string _defaultErrorMessage = "Library with title {0} is already exist";
        private UnitOfWork unit = new UnitOfWork();

        public ValidateDublicateNameAttribute()
            : base(_defaultErrorMessage)
        {
        }
        public override s

tring FormatErrorMessage(string name) { return String.Format(ErrorMessageString, name); }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        string valueAsString = value as string;
        ValidationResult result = ValidationResult.Success;
        if (String.IsNullOrEmpty(valueAsString))
        {
            if (unit.ResourceSrvc.GetLibraryByTitle(valueAsString) != null)
            {
                result = new ValidationResult(String.Format(_defaultErrorMessage,value));
            }
        }
        else
        {
            result = new ValidationResult("Title cant be empty or null");
        }
        return result;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = this.ErrorMessage,
            ValidationType = "dublicatename",
        };
        yield return rule;
    }
}

それを使用してモデルを装飾しました

public class ResourceLibraryModel
{
    public Guid LibraryId { get; set; }
    [Required]
    [ValidateDublicateName(ErrorMessage="title cant dublicate")]
    public string Title { get; set; }
}

私が持っているクライアント側で

<script src="/Scripts/jquery.validate.min.js" type="text/javascript"></script>
<script src="/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>
<script type="text/javascript">
    $(document).ready(function () {

        $.validator.addMethod("dublicatename", function (value, element, params) {
            alert("test");
        });

    });
</script>

検証パラメーターがなく、 $.validator.unobtrusive.adapters.add(....) を書きませんでした

サーバー側の検証は完全に機能しますが、クライアント側は機能しません。

何か案は?

そして、これはビューです

     @using (Ajax.BeginForm("CreateLibrary", "Resource", new AjaxOptions { OnSuccess = "RequestSucceeded"}))
        {
            @Html.ValidationSummary(true, "Account creation was unsuccessful. Please correct the errors and try again.")
                <div>
                    @*<div style="margin-bottom:15px">
                        <label><b>Library information:</b></label>
                    </div>*@

                    <div class="editor-field">
                        @Html.TextBoxFor(m => m.Title, new { @class = "logon-field" })
                        @Html.ValidationMessageFor(m => m.Title)
                    </div>
                    <div class="editor-label">
                        @Html.LabelFor(m => m.Title)
                    </div>
                 </div>
}
4

2 に答える 2

0

jquery.validate.min.js問題は、JavaScriptコードの後に​​ロードする必要があることだと思います...

于 2011-08-24T06:19:43.873 に答える
0

推測ですが、Web.config ファイルでクライアント側の検証を有効にしていますか?

 <appSettings>
  <add key="ClientValidationEnabled" value="true"/> 
  <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
 </appSettings>

その場合は、このリンクの「クライアント側の検証を有効にする」セクションに従ってください: http://www.asp.net/mvc/tutorials/creating-a-mvc-3-application-with-razor-and-unobtrusive-javascript

于 2011-08-24T07:14:20.113 に答える