gpt4 book ai didi

asp.net-mvc - ASP.NET MVC + FluentValidation + PartialView > 无客户端验证

转载 作者:行者123 更新时间:2023-12-02 11:23:42 31 4
gpt4 key购买 nike

我使用 FluentValidation 来验证我的 ASP.NET MVC 5.1 View 模型(使用默认的不显眼的客户端验证)。我通过 Ninject 注册/创建验证器( View 模型上没有属性):

FluentValidationModelValidatorProvider.Configure(x => x.ValidatorFactory = new NinjectValidatorFactory(_kernel));
AssemblyScanner.FindValidatorsInAssembly(Assembly.GetExecutingAssembly()).ForEach(match => _kernel.Bind(match.InterfaceType).To(match.ValidatorType));

我有一个在整个应用程序中经常使用的部分 View 。该部分 View 有自己的 View 模型。 “主” View 模型(整个 View 的 View 模型)只是继承自这个“部分” View 模型。

public class IndexViewModel : PersonalInfoViewModel { ... }

验证器使用相同的模式:

public class IndexValidator : PersonalInfoValidator { ... }

这工作得很好,服务器端验证和“主” View 上的客户端验证一样有效。但不会触发分部 View 上的客户端验证(输入字段上没有 data-val-* 属性)。

我的“主” View Index.cshtml

@model IndexViewModel
@Html.TextBoxFor(x => x.SomeProperty) // client-side validation works fine

@Html.Partial("PersonalInfo") // client-side validation in the partial view does not work (see below)

我的部分 View PersonalInfo.cshtml:

@model PersonalInfoViewModel
@Html.TextBoxFor(x => x.FirstName) // client-side validation does not work

我注意到,当我将部分 View 的模型更改为“主” View 模型时,它会起作用:

@model IndexViewModel
@Html.TextBoxFor(x => x.FirstName) // client-side validation works

所以我猜想在构建客户端验证时,正确的验证器不会被拾取,并且没有 data-val-* 属性被注入(inject)到 HTML 中。但我无法更改部分 View 上的 View 模型,因为它在具有不同“主” View 的多个不同页面上使用(尽管全部继承自 PersonalInfoViewModel)。

关于如何让我的客户端验证在这种情况下工作有什么想法吗?

更新

经过几个小时的挖掘 ASP.NET WebStack 源代码,我发现问题似乎出现在 TextBoxFor 方法中。那里的 ModelMetaData 是从模型创建的 - 并且在那里它开始使用 IndexViewModel 而不是 PersonalInfoViewModel 来获取客户端的元数据验证:

ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
Html.GetUnobtrusiveValidationAttributes("FirstName", metadata); // no client-side validation attributes found

但是,如果我没有明确指定元数据,这会生成正确的客户端验证属性:

Html.GetUnobtrusiveValidationAttributes("FirstName");

不幸的是,到目前为止我还没有找到一种方法来利用这些知识为我带来好处。

最佳答案

我无法找到解决问题的好方法,并且不想再使用 ASP.NET WebStack 源代码,因此我采用了一个丑陋的解决方法:

在渲染输入字段时,我“手动”注入(inject)缺少的 data-val-* 属性,如下所示:

@Html.TextBoxFor(x => x.FirstName, Html.GetUnobtrusiveValidationAttributes("FirstName"))

由于 GetUnobtrusiveValidationAttributes (称为独立)构建了正确的 HTML 属性,我只需将它们添加到 TextBox 中即可。绝对不漂亮,但它有效,我可以继续我的工作。如果有人有更好的解决方案,我会很高兴听到。

关于asp.net-mvc - ASP.NET MVC + FluentValidation + PartialView > 无客户端验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22011433/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com