Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 我必须做什么才能让FluentValidation显示我的自定义消息?_Asp.net Mvc_Asp.net Mvc 4_Fluentvalidation - Fatal编程技术网

Asp.net mvc 我必须做什么才能让FluentValidation显示我的自定义消息?

Asp.net mvc 我必须做什么才能让FluentValidation显示我的自定义消息?,asp.net-mvc,asp.net-mvc-4,fluentvalidation,Asp.net Mvc,Asp.net Mvc 4,Fluentvalidation,现在,它只是显示一个通用的 “缩写”不应为空 以下规则的消息: context.RulesFor(p => p.Initials).Required(p => p.Message("Initials are frikking required.")).Length(0, 8); initials属性在类型为applicationprofilemodel:MappedViewModel的相当大的模型中声明为普通的公共字符串initials{get;set;},甚至没有显示名称属性,但

现在,它只是显示一个通用的

“缩写”不应为空

以下规则的消息:

context.RulesFor(p => p.Initials).Required(p => p.Message("Initials are frikking required.")).Length(0, 8);
initials属性在类型为
applicationprofilemodel:MappedViewModel
的相当大的模型中声明为普通的
公共字符串initials{get;set;}
,甚至没有显示名称属性,但即使添加显示名称,我也会遇到同样的问题

视图模型中没有
必需的
属性

控制器操作代码为:

[HttpGet]
public ActionResult Create()
{
    var applicant = _applicantService.BuildApplicantProfile();
    var model = new ApplicantProfileModel();
    model.MapFromEntity(applicant);
    return View(model);
}
这是我最后无数个项目的标准代码,除了FluentValidation自定义消息之外,其他一切都正常工作。他们的验证很好

意见是:

<li class="form-line">
    @Html.LabelFor(m => m.Initials)
    @Html.EditorFor(m => m.Initials)
    @Html.ValidationMessageFor(m => m.Initials)
</li>
  • @LabelFor(m=>m.Initials) @EditorFor(m=>m.Initials) @Html.ValidationMessageFor(m=>m.Initials)

  • 我也尝试了
    TextBoxFor
    ,但没有区别。

    您是否在属性上留下了
    [必需]
    数据注释属性?我发现,如果这些规则保持打开状态,则会显示它们,而不是显示我的自定义验证规则

    编辑:这就是我过去设置验证器的方式-也可能是因为您正在执行
    HttpGet
    而不是
    HttpPost
    ,并且您需要手动调用Validate,所以验证器没有启动

    public class ApplicantProfileModelValidator : AbstractValidator<ApplicantProfileModel>
    {
        public ApplicantProfileModelValidator()
        {
            RuleFor(r => r.Initials)
                .NotEmpty()
                .WithMessage("Initials are frikking required.");
        }
    }
    
    公共类applicationProfileModelValidator:AbstractValidator
    {
    公共应用程序ProfileModelValidator()
    {
    规则(r=>r.首字母)
    .NotEmpty()
    .WithMessage(“需要首字母缩写”);
    }
    }
    
    结果是我混淆了两个不同但非常相似的valiation库。我最初是从NuGet开始的,或者在NuGet上被称为FluentMVC。这需要您的模型实现一个名为
    InitializeModel(ModelContext context)
    的方法,在该方法中,您可以为各种属性添加规则,例如

    context.RulesFor(p => p.Id).Required(p => p.Message("Id is missing. Message may have been tampered with.").StopOnFail());
    
    验证引擎以某种方式在所有模型上调用此方法,因为尽管指示在已验证的模型上实现
    imodeinitializer
    接口,但我不是。这并不是说规则正在注册,但该库的某些部分处于活动状态,并且与我尝试使用的库相冲突,在NuGet上称为FluentValidation、FluentValidation.MVC3和FluentValidation.MVC4


    从我的模型中移动了
    InitializeModel
    mehod之后,一切似乎都正常了。我粗鲁的验证测试消息现在显示出来了,这样它们就不会偷偷地通过测试和发布管理器。

    您的代码看起来不错。
    首字母
    属性的类型是什么?您能给出一个完整的示例(包括模型、视图和控制器)来重现您在这里描述的问题吗?不,在该模型的任何地方都没有一个
    必需的
    。这是我使用Fluent的第一个模型。你能展示验证器的完整代码吗?这可能是你设置的方式