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).