Občas jsme donuceni umístit control <form runat=“server“> už do MasterPage, například proto, že máme v MasterPage navigační TreeView či jiný control vyžadující <form>. Pak nastává otázka, jak ve vlastní content-page nastavit formuláři vlastnosti DefaultButton a DefaultFocus na tam umístěné controly.
<%@ Master ... %>
...
<body>
<form id="MainForm" runat="server">
...
<asp:ContentPlaceHolder ID="BodyCPH" runat="server" />
...
</form>
</body>
...
Content-page s controly:
<%@ Page MasterPageFile="..." ... %>
<asp:Content ContentPlaceHolderID="BodyCPH" runat="server">
<asp:TextBox ID="UsernameTB" runat="server" />
<asp:LinkButton ID="LoginLB" runat="server" />
</asp:Content>
Mnohé správně napadne, že Page má property Form, přes kterou to jistě půjde nastavit. Ano, nicméně properties DefaultFocus a DefaultButton jsou typu string a pokud zkusíme například
Page.Form.DefaultButton = "LoginLB"; // špatně !!!
Page.Form.DefaultButton = LoginLB.ID; // špatně !!!
…pak budeme odměněni výjimkou InvalidOperationException: The DefaultButton of ‚MainForm‘ must be the ID of a control of type IButtonControl.
Správně je v případě DefaultButton potřeba předat UniqueID a v případě DefaultFocus ClientIDdaného controlu, protože je potřeba ho identifikovat včetně NamingContaineru (form a button jsou každý v jiném naming containeru)
Page.Form.DefaultButton = LoginLB.UniqueID;
Page.Form.DefaultFocus = UsernameTB.ClientID;
Stejným způsobem bychom postupovali nejenom v případě MasterPage, ale například i v případě, kdy bychom chtěli vlastnosti DefaultButton či DefaultFocus ovlivnit z nějakého controlu (což bych spíše nedoporučoval).
Líbí se mi to:
To se mi líbí Načítání...