8

我们有一个现有的 ASP.Net Web 应用程序,我们希望将其转换为使用母版页。在执行此操作的过程中,我发现为 HTML 元素生成的 HTML id 以 ContentPlaceHolder 的 id 为前缀。这就是我们设置 ContentPlaceHolder 的 clientidmode=static 时可以预料到的。现在,由于我们有很多使用 id 的现有客户端脚本,所以当我们使用母版页时,这部分会中断,并且运行所有的 javascript 以确保我们使用 Control.ClientID 调用 javascript 是一项艰巨的工作,因为很多都是硬编码的。

有没有办法禁用前缀?如果我创建每个控件设置其 ClientIdMode=static,我可以成功执行此操作,但我更喜欢设置一次,以确保所有控件都具有其 ClientIdMode=static。那可能吗?或者是否可以覆盖 ContentPlaceHolder 的 NamingContainer?

该平台是.Net 4.0

(在 web.config 中使用 ClientIdMode=static 解决上述问题后,如下面的答案所述),我遇到了自动生成“name”属性的问题,并且没有设置为我介绍之前的任何内容母版页。这给我现有的服务器代码带来了问题,它有很多 Request.Form[]。知道解决这个问题的最佳实践是什么吗?

感谢圣战

4

2 回答 2

9

您可以ClientIDMode在页面级别:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" ClientIDMode="Static" %>

母版页级别:

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" ClientIDMode="Static" %>

和 Web.Config 级别(使所有页面都继承此行为):

<system.web>
    <compilation debug="true" targetFramework="4.0"/>
    <pages clientIDMode="Static"></pages>
</system.web>
于 2013-04-19T22:11:53.770 回答
1

如果您不以 .Net 框架 4 为目标,并且 clientIDMode 枚举不可用,则可以简单地覆盖控件类。这是 HtmlGenericControl 的示例,但可以使用任何其他控件完成:

public class NoNamingContainerControl : HtmlGenericControl
{
    public NoNamingContainerControl(string tag) : base(tag) { }
    public override string ClientID
    {
        get
        {
            return this.ID;
        }
    }
}

此代码应适用于任何 .Net 框架版本,尽管在 .net 4 中您可能应该使用 clientIDMode

于 2017-07-12T21:20:44.117 回答