带有前缀的控件的 Asp.Net MVC2 客户端验证问题

Posted

技术标签:

【中文标题】带有前缀的控件的 Asp.Net MVC2 客户端验证问题【英文标题】:Asp.Net MVC2 Clientside Validation problem with controls with prefixes 【发布时间】:2010-05-03 15:31:58 【问题描述】:

问题是:当我在一个页面上放置 2 个相同类型的控件时,我需要指定不同的前缀进行绑定。在这种情况下,表单后生成的验证规则不正确。那么如何让客户验证这个案例呢?:

页面包含:

<%
    html.RenderPartial(ViewLocations.Shared.PhoneEditPartial, new PhoneViewModel  Phone = person.PhonePhone, Prefix = "PhonePhone" );
    Html.RenderPartial(ViewLocations.Shared.PhoneEditPartial, new PhoneViewModel  Phone = person.FaxPhone, Prefix = "FaxPhone" );
%>

控件ViewUserControl

<%= Html.TextBox(Model.GetPrefixed("CountryCode"), Model.Phone.CountryCode) %>
<%= Html.ValidationMessage("Phone.CountryCode", new  id = Model.GetPrefixed("CountryCode"), name = Model.GetPrefixed("CountryCode") )%>

Model.GetPrefixed("CountryCode") 仅根据前缀返回“FaxPhone.CountryCode”或“PhonePhone.CountryCode”


这里是表单后生成的验证规则。它们为字段名称“Phone.CountryCode”重复。虽然所需的结果是每个字段名称“FaxPhone.CountryCode”、“PhonePhone.CountryCode”的 2 个规则(必需,数字) alt text http://www.freeimagehosting.net/uploads/37fbe720bf.png

这个问题与Asp.Net MVC2 Clientside Validation and duplicate ID's problem有些重复 但是手动生成 id 的建议没有帮助。

【问题讨论】:

【参考方案1】:

为文本框和验证设置相同前缀的正确方法:

<% using (Html.BeginHtmlFieldPrefixScope(Model.Prefix))  %>
   <%= Html.TextBoxFor(m => m.Address.PostCode) %>
   <%= Html.ValidationMessageFor(m => m.Address.PostCode) %>
<%  %>

在哪里

public static class HtmlPrefixScopeExtensions

    public static IDisposable BeginHtmlFieldPrefixScope(this HtmlHelper html, string htmlFieldPrefix)
    
        return new HtmlFieldPrefixScope(html.ViewData.TemplateInfo, htmlFieldPrefix);
    

    private class HtmlFieldPrefixScope : IDisposable
    
        private readonly TemplateInfo templateInfo;
        private readonly string previousHtmlFieldPrefix;

        public HtmlFieldPrefixScope(TemplateInfo templateInfo, string htmlFieldPrefix)
        
            this.templateInfo = templateInfo;

            previousHtmlFieldPrefix = templateInfo.HtmlFieldPrefix;
            templateInfo.HtmlFieldPrefix = htmlFieldPrefix;
        

        public void Dispose()
        
            templateInfo.HtmlFieldPrefix = previousHtmlFieldPrefix;
        
    

(偶然在史蒂夫·桑德森的博客http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/的代码中找到了解决方案)

看起来 Html.EditorFor 方法应该像这里建议的那样工作:ASP.NET MVC 2 - ViewModel Prefix

【讨论】:

不错。这个答案非常有帮助。希望我能再投票几次。 非常非常有帮助。谢谢。 我知道这是一个旧答案,但我想知道你的方法是否比把它放在你的视图中更可取:ViewData.TemplateInfo.HtmlFieldPrefix = "myViewModel.MyCustomObjdect"; 是的,因为它以 DRY 方式执行相同的操作等等:它在 Dispose 方法中恢复以前的 HtmlFieldPrefix。 我认为这应该是 MVC 核心功能的一部分

以上是关于带有前缀的控件的 Asp.Net MVC2 客户端验证问题的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC2 自定义 jQuery 验证:客户端

在哪里可以找到在 ASP .NET MVC2 中实现密码恢复的 C# 示例代码

asp.net mvc2.0中如何将datatable对象传到view的前台然后获取datatable中表字段得值?

用ASP.NET MVC2做了个简单的增删改查例子,一般分页也做了,可是查询分页时不行!请看问题补充。

ASP.Net mvc2 url 格式问题

Wordpress 类似于 ASP.NET MVC2/3 或 ASP.NET 4.0 中的动态永久链接