簡體   English   中英

Asp.Net MVC和自定義不干擾驗證

[英]Asp.Net MVC and custom unobtrusive validation

我正在嘗試使“ mustbetrue”自定義規則起作用。 大致基於這個問題 :我的問題是,當我提交表單時,客戶端驗證不會給我一個錯誤(不會使驗證文本出現)。 另外,我在jscript驗證方法中設置了一個斷點,因此永遠不會被觸發。 添加適配器的連線代碼確實被觸發。 控制台中沒有錯誤。

我究竟做錯了什么?

這是我在服務器端的內容:

public class MustBeTrueAttribute : ValidationAttribute, IClientValidatable
{
    public override bool IsValid(object value)
    {
        if (value == null) return false;
        try
        {
            return Convert.ToBoolean(value);
        }
        catch (InvalidCastException)
        {
            return false;
        }
    }

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

public class MustBeTrueAttributeAdapter : DataAnnotationsModelValidator<MustBeTrueAttribute>
{
    public MustBeTrueAttributeAdapter(ModelMetadata metadata, ControllerContext context, MustBeTrueAttribute attribute)
        : base(metadata, context, attribute)
    {
    }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        return new[] { new ModelClientValidationMustBeTrueRule(ErrorMessage) };
    }
}

public class ModelClientValidationMustBeTrueRule : ModelClientValidationRule
{
    public ModelClientValidationMustBeTrueRule(string errorMessage)
    {
        ErrorMessage = errorMessage;
        ValidationType = "mustbetrue";
    }
}

並在global.asax中

    protected void Application_Start()
    {
        // stuff
        DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(MustBeTrueAttribute), typeof(MustBeTrueAttributeAdapter));
        // stuff
    }

並在對象上:

[MustBeTrue(ErrorMessageResourceName = "Register_TermsNotAccepted", ErrorMessageResourceType = typeof(Resources.Global))]
public bool AcceptedTerms { get; set; }

客戶端:

$(document).ready(function () {
    jQuery.validator.addMethod("mustbetrue", function (value, element) {
        if (!this.depend(param, element))
            return "dependency-mismatch";
        return element.checked;
    });
    jQuery.validator.unobtrusive.adapters.addBool("mustbetrue", "mustbetrue");
});

以及輸出的相關HTML:

<input data-val="true" data-val-mustbetrue="You must accept the terms and conditions" data-val-required="The AcceptedTerms field is required." id="AcceptedTerms" name="AcceptedTerms" type="checkbox" value="true" class="valid">

如果您已經檢查了是否啟用了客戶端驗證(無論是在配置中還是在代碼中),那么我想這是因為您是不干擾驗證腳本解析html 之后添加適配器的 請參閱我的答案以獲取詳細信息和可能的選項

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM