【问题标题】:ASP.Net Core MVC client side validation: attributes do not displayASP.Net Core MVC 客户端验证:属性不显示
【发布时间】:2020-11-15 20:16:44
【问题描述】:

我已经构建了一个简单的 .net Core MVC 应用程序。 我有一个返回带有模型的 ViewResult 的操作:

public class Model {
    public string A { get; set; }
    public Model2 Model2 { get; set; }
}

public class Model2 {
    public string B { get; set; }
}

还有一个 AbstractValidator:

services.AddTransient<IValidator<Model>, ModelValidator>();

public class ModelValidator : AbstractValidator<Model>
{
    public ModelValidator()
    {
        RuleFor(x => x.Model2.B)
       .NotEmpty().WithMessage("Required");

        RuleFor(x => x.A)
       .NotEmpty().WithMessage("Required");
    }
}

我还包含 jquery、jquery.validate 和 jquery.validate.unobtrusive 以及正确的顺序。

我的问题:当我在 HTML 中添加输入标签时,不会为子类生成 data-val 属性。

@*Has data-val attributes*@
<div>
    <label asp-for="A"></label>
    <input asp-for="A" class="form-control" />
    <span asp-validation-for="A" class="validation-error"></span>
</div>

@*Has no data-val attributes*@
<div>
    <label asp-for="Model2.B"></label>
    <input asp-for="Model2.B" class="form-control" />
    <span asp-validation-for="Model2.B" class="validation-error"></span>
</div>

我忘记了什么?

【问题讨论】:

    标签: c# asp.net-core-mvc unobtrusive-validation


    【解决方案1】:

    您可以在表单上尝试不显眼的验证,这将验证您的嵌套对象属性 (Model2.B)。有关不显眼验证的更多信息,请参阅this GitHub issue. 所以,以下是您应该实现的代码。

    添加一个 javascript 函数,在您的表单上实现不引人注目的验证:

     function submitForm(form) {
        $.validator.unobtrusive.parse(form);
    
        //form validation is evaluated here
        if ($(form).valid()) {
            //here your own code...
        }
        else {
            //here your own code...
        }
        return false;
    }
    

    在您的 html 表单中调用上述函数。

        <form onsubmit="return submitForm(this)">
            //this part is for your own sake
    
            //button type should be submit 
                <div class="form-group">
                    <button type="submit" class="btn btn-success form-control text-white">Submit</button>
                </div>
        </form>
    

    【讨论】:

    • 当razor生成html时Model2B的输入没有data-val属性,所以validator总是为它返回true。
    • 是的,但我更新了问题。 Require 属性在验证器类中,而不在属性中。它会导致问题。如果我在输入字段上有 data-val 属性,您的答案是正确的。谢谢
    【解决方案2】:

    FluentValidation 不支持正确嵌套的类客户端验证。 使用 ViewModel 验证属性而不是它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-03
      • 2014-11-03
      • 1970-01-01
      • 2010-09-14
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      相关资源
      最近更新 更多