Asp.Netリカバリページ内のユーザーコントロール内のコントロールClientID

4678 ワード

よく知られているAsp.Netでユーザーコントロール(またはマスターページ)がページに追加されている場合、ユーザーコントロール内のコントロールのClientID番号がページ内のユーザーコントロールのClientIDに自動的に追加されます.
すなわち、ページ内のコントロール内のコントロールClientID=ユーザーコントロールid番号+""+ユーザーコントロール内のコントロールのid番号
あまりにも回りくどいことを言っているので,やはり次の例を見てみましょう.
aspでNetページindex.aspxにheadが追加されました.ascxユーザーコントロールid番号は「
head1
"
head.ascxコントロールにinput#hid_がありますnameコントロール
ではaspxが最終的に生成したinputのidは「head 1_hid_name」
"
MSはなぜこのように設計したのですか?
主にaspです.Netのすべてのコントロールには一意のid番号があります(
ClientID
)、ページが再送されると.Netはこのid番号で再送後の後続処理を行うことができます
一方、1つのページに複数のユーザーコントロールが含まれている場合は、1つのユーザーコントロールのid番号が一意である可能性がありますが、1つのページにマージすると重複するid番号が発生する可能性があります.
だからasp.Netは各ユーザコントロールのidの前にそのユーザコントロールのidを追加し、1ページに重複するid番号は表示されません(1ページに重複するid番号がコンパイルされている場合)
 
ソリューション:
いくつかの理由で、実際のユーザーコントロールのコントロールidを使用する必要がある場合があります.
すでに書いたjsイベント、cssスタイルなど
元のコントロールid番号を復元する必要があります
1.現在のjsファイルとcssファイルを修正するにはclassを使用して処理するが、この方法はあまりにも頼りにならない.
2.jsファイルを書くasp.Netで生成されたid番号をユーザーコントロールid番号に置き換え、使用するページごとに参照すればよい
再送要求がある場合は、再送前にaspを復元することができる.Netで生成するclientid番号はaspに影響しない.Netの再送処理
//htl add 2014-12-25
//        id 
var _id = 'details1_';
//         id      id   
jQuery("[id*=" + _id + "]").each(function($) {
    $(this).attr("id", $(this).attr("id").replace(_id, ""));
    //       ,         asp.net   id 
    $(this).attr('usercontrol', '');
});
//       asp.net   id 
jQuery("form").submit(function() {
    jQuery("[usercontrol]").each(function() {
        $(this).attr("id", _id + $(this).attr("id"));
    });
});

 
3.asp.Netページでコードを置き換えると、再送時に対応するコントロールidが見つからず、本物のコントロールが見つからずビジネス処理に影響します.
/// <summary>
/// htl add 2014-12-25
///           ClientID 
///               ,         ClientID          id
/// </summary>
/// <param name="writer"></param>
protectedoverridevoidRender(HtmlTextWriter writer) {
    System.IO.StringWriter sw = newSystem.IO.StringWriter();
    base.Render(newHtmlTextWriter(sw)); //       html,  __VIEWSTATE
    //       ClientID            ClientID
    //                      
    writer.WriteLine(Web.PageHelp.RegexStr(@details1.ClientID + "_", sw.ToString()).Trim());
}

 
参照先:
MSDN Control.ClientID属性
 
為知ノート(Wiz)から