- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 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/
如果另一个属性“Found”为真,我正在尝试使用 FluentValidation 来验证属性“Username”。 Object Contains: string Username bo
如果另一个属性“Found”为真,我正在尝试使用 FluentValidation 来验证属性“Username”。 Object Contains: string Username bo
我有一个包含需要验证的集合的类。集合上的泛型采用接口(interface),可以将不同的类型添加到集合中。 创建支持多态性的 FluentValidation 验证器的最简洁路径是什么? public
我已经开始使用 FluentValidation在 WPF 项目中,到目前为止,我以一种简单的方式使用它,检查字段是否已填充或少于 n 个字符。 现在我必须检查插入的值(这是一个字符串......该死
如何使用流畅的验证来验证整数列表? 我的模型有: public List WindowGlassItems { get; set; } 模型验证器有 RuleFor(x => x.WindowGla
如何使用流畅的验证来验证整数列表? 我的模型有: public List WindowGlassItems { get; set; } 模型验证器有 RuleFor(x => x.WindowGla
我在不止一个程序集中有 FluentValidators。在 FluentValidation 的早期版本中,我可以这样注册: services.AddMvc() .AddFluentValida
试图找出让 NHibernate ISession 成为流畅的验证抽象验证器的最佳方法。问题是 ISession 是根据 Web 请求注册的,而验证器出于性能原因根据 fluent 的最佳实践注册为单
我已经尝试在我的 ASP.NET MVC4 项目中设置 Ninject.Web.Mvc.FluentValidation如下图: var ninjectValidatorFactory = new N
我正在使用 FluentValidation.AspNetcore 8.2.2,并且有一个对象模型,其中包含相同类型的子项列表。我想使用流畅的验证来验证对象。尝试为子对象设置验证器时,我遇到堆栈溢出异
我想试试 .NET FluentValidation用于即将进行的项目的表单输入验证的库。在查看文档时,我发现了这个: 性能说明 由于 RuleFor 定义中的表达式树编译和解析,验证器的实例化是一个
我只想验证在我的模型上发生更改的属性,不幸的是,默认情况下流畅的验证似乎会验证调用 Validator.Validate(instanceToValidate) 时具有规则的每个属性 我已经尝试将 P
我有课: Sponsored { int Order }; 我收集了它: IEnumerable sponsored; 我想检查 Order 对于这个集合是否是唯一的。 我可以通过 FluentVal
我正在使用图书馆 "FluentValidation.AspNetCore": "6.4.0-beta3"在 .netcore WebApi在一个项目中。您可以在下面看到项目结构。如果我放置 Curr
Reading the documentation在 .NET Core 中,您似乎可以使用以下方法进行隐式子属性验证: services.AddMvc().AddFluentValidation(f
我有这个验证器: public class InputValidator : AbstractValidator { public InputValidator() {
我正在 .NET Core 中使用 FluentValidator。大多数情况下,一切都运行良好,但我注意到在处理复杂类型时,FluentValidator 会显示完整的属性名称。例如,假设我有一个名
我正在努力为一个类实现一个验证器,其中应该只设置一个属性。 假设我们有以下类: public class SomeClass { public DateTime SomeDate {get;
我一直在 ASP.NET MVC 3 中的 View 模型上使用 FluentValidation,它工作得很棒! 我现在想将它用作我的服务层内域对象的验证引擎。 你能用它做复杂的验证方案吗? 我正在
我想像这样使用 FluentValidation: public class CustomValidator : AbstractValidator { public CustomValidato
我是一名优秀的程序员,十分优秀!