Asp.net

如何禁用/覆蓋命名容器的 ID 生成內容頁面的控制項 ID

  • July 12, 2017

我們有一個現有的 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

$$ $$. 知道解決這個問題的最佳實踐是什麼嗎? 感謝聖戰

您可以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>

如果您不以 .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

引用自:https://stackoverflow.com/questions/16114040