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 Framework 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 に答える