【问题标题】:ASP.NET MVC + FluentValidation + PartialView > no client-side validationASP.NET MVC + FluentValidation + PartialView > 无客户端验证
【发布时间】:2014-03-27 12:18:36
【问题描述】:

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

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

我有一个在整个应用程序中经常使用的局部视图。这个局部视图有它自己的视图模型。 “主”视图模型(整个视图的视图模型)只是从这个“部分”视图模型继承而来。

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

我注意到当我将局部视图的模型更改为“主”视图模型时它可以工作:

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

所以我猜想在构建客户端验证时的某个地方没有选择正确的验证器,并且没有data-val-* 属性被注入到 HTML 中。但我无法更改局部视图上的视图模型,因为它用于具有不同“主”视图的几个不同页面(虽然都继承自 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-mvc validation asp.net-mvc-5 fluentvalidation


    【解决方案1】:

    我找不到解决问题的好方法,也不想再玩弄 ASP.NET WebStack 源代码,所以我选择了一个丑陋的解决方法:

    在呈现输入字段时,我“手动”注入缺少的 data-val-* 属性,如下所示:

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

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

    【讨论】:

    • 还是个问题。我不得不使用相同的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2010-09-14
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    相关资源
    最近更新 更多