asp.net-mvc – ASP.NET MVC FluentValidation PartialView&g
我使用FluentValidation来验证我的ASP.NET MVC 5.1视图模型(使用默认的不显眼的客户端验证).我通过Ninject注册/创建我的验证器(viewmodels上没有属性):
FluentValidationModelValidatorProvider.Configure(x => x.ValidatorFactory = new NinjectValidatorFactory(_kernel)); AssemblyScanner.FindValidatorsInAssembly(Assembly.GetExecutingAssembly()).ForEach(match => _kernel.Bind(match.InterfaceType).To(match.ValidatorType)); 我有一个在整个应用程序中经常使用的局部视图.此局部视图具有自己的视图模型. “main”视图模型(整个视图的视图模型)只是从这个“部分”视图模型继承而来. public class IndexViewModel : PersonalInfoViewModel { ... } 验证器使用相同的模式: public class IndexValidator : PersonalInfoValidator { ... } 这工作正常,服务器端验证以及“主”视图上的客户端验证工作.但是不会触发部分视图的客户端验证(输入字段上没有data-val- *属性). 我的“主要”视图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) 我的部分视图PersonalInfo.cshtml: @model PersonalInfoViewModel @Html.TextBoxFor(x => x.FirstName) // client-side validation does not work 我注意到当我将局部视图的模型更改为“main”viewmodel时它可以工作: @model IndexViewModel @Html.TextBoxFor(x => x.FirstName) // client-side validation works 所以我想在构建客户端验证的某个地方,正确的验证器没有被拾取,并且没有数据-val- *属性被注入到HTML中.但是我无法更改局部视图上的viewmodel,因为它在具有不同“主”视图的几个不同页面上使用(尽管都是从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源了,所以我选择了一个丑陋的解决方法:
我在渲染输入字段时“手动”注入缺少的data-val- *属性,如下所示: @Html.TextBoxFor(x => x.FirstName,Html.GetUnobtrusiveValidationAttributes("FirstName")) 由于GetUnobtrusiveValidationAttributes(称为独立)构建正确的HTML属性,我只需将它们添加到TextBox即可.绝对不漂亮,但它有效,我可以继续我的工作.如果有人有更好的解决方案,我会很高兴听到它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 检查控制启动的AJAX请求
- asp.net-mvc – @ Html.Action in Asp.Net Core
- 通过ASP.NET Web应用程序上载500MB文件
- asp.net-mvc – 使用viewmodel时的asp.net mvc验证
- Azure中的ASP.NET会话状态提供程序[closed]
- asp.net-mvc-3 – Telerik MVC网格,在运行时从集合或字典中
- asp.net – 在Owin应用程序中每个请求的数据缓存
- 十七点学完安全知识超级详细了解进程和病毒知识 转载
- asp.net-mvc-3 – 如何在web.config中设置不同的stmpclient
- asp.net-mvc – 从ASP.NET MVC2升级到MVC3的原因
- asp.net-mvc – Knockoutjs可编辑网格
- asp.net-mvc – 如何在ASP.NET MVC控制器工厂中处
- asp.net – “MVC 3视图”中的当前上下文中不存在
- asp.net-mvc – 如何扩展/架构ASP.NET MVC 3授权
- asp.net – 从请求中获取所有发布数据
- asp.net-mvc – 为什么我的MVC应用程序中有两个w
- asp.net – Web.Config奇怪的部分?
- asp.net-mvc-4 – 如何将自定义css / js添加到MV
- 如何使用APDU将PIN验证代码发送到智能卡 – 使用
- asp.net-mvc – 谁设置HttpContext.User.Identit