2011-02-01 9 views
0

テンプレートユーザーコントロールで作業しています。コントロールの最終的なマークアップでは、データはコンテナキーワードでアクセスされています。私はこれがキーワードかコンテナ単語がどこから来ているのかを理解していないので、「キーワード」という言葉を自由に使用しています。以下は私の本の例です。ASP.NETテンプレートユーザーコントロール "コンテナ"キーワード

//Address User Control markup 
<%@ Control Language="C#" AutoEventWireup="true" 
CodeFile="AddressUcTemplated.ascx.cs" Inherits="AddressUcTemplated" %> 
<asp:PlaceHolder runat="server" 
ID="PlaceHolderAddressTemplate"> 
</asp:PlaceHolder> 

-

//Address User Control code-behind 
public partial class AddressUcTemplated : 
System.Web.UI.UserControl 
{ 
protected void Page_Init(object sender, EventArgs e) 
{ 
//clear the controls from the placeholder 
PlaceHolderAddressTemplate.Controls.Clear(); 
if (LayoutTemplate == null) 
{ 
PlaceHolderAddressTemplate.Controls.Add(
new LiteralControl("No template defined.")); 
} 
else 
{ 
AddressUcContainer container = new 
AddressUcContainer(this.Address); 
this.LayoutTemplate.InstantiateIn(container); 
//add the controls to the placeholder 
PlaceHolderAddressTemplate.Controls.Add(container); 
} 
} 
[PersistenceMode(PersistenceMode.InnerProperty)] 
[TemplateContainer(typeof(AddressUcContainer))] 
public ITemplate LayoutTemplate { get; set; } 
public Address Address { get; set; } 
} 

-

//Naming Container Class 
    public class AddressUcContainer : Control, INamingContainer 
    { 
    public AddressUcContainer(Address address) 
    { 
    this.Address = address; 
    } 
    public Address Address { get; set; } 
    } 

-

 //Page using the user control; the Container keyword is confusing me in the below //statement 
... 
<%@ Register src="AddressUcTemplated.ascx" tagname="AddressUcTemplated" 
tagprefix="uc1" %> 
     <uc1:AddressUcTemplated ID="AddressUcTemplated1" 
     runat="server" AddressType="Home"> 
     <LayoutTemplate> 
     <h1>Edit Home Address</h1> 
     <table> 
     <tr> 
     <td>Address Line 1:</td> 
     <td> 
     <asp:TextBox ID="TextBoxAddress" runat="server" 
     Text="<%#Container.Address.AddressLine1%>"></asp:TextBox> 
     ... 

答えて

0

次のように私のコード例は、次のとおり

<asp:Repeater runat="server"> 
    <ItemTemplate><%# Container.DataItem %></ItemTemplate> 
</asp:Repeater> 

インテリセンスは、コンテナはRepeaterItemのフィールド/変数であると述べています。変数部分は、パブリックなものであればおそらくプロパティだったので、これは特別な構文解析であると私に伝えます。

とにかく、私のコードは、他の中で、以下のデータバインディングコード、に解析されています

public void __DataBind__control4(object sender, EventArgs e) { 
    var target = (DataBoundLiteralControl)sender; 
    var Container = (RepeaterItem)target.BindingContainer; 
    target.SetDataBoundString(0, Convert.ToString(Container.DataItem, CultureInfo.CurrentCulture)); 
} 

<%# ... %>がDataBoundLiteralControlで、Containerがインテリセンスにさらされています変数です。これはまたtarget変数があり、ではなく、がintellisenseで表示されますが、問題なくコンパイルされます。これにより、生成されたクラスのすべての非公開(例えば、)にアクセスできることにも注意してください。

<%# target %>が働きますが、<%# dummy %>はありません。一方で、<%# __DataBind__control4(null, null) %>は、1)「System.Convert.ToString(object、System.IFormatProvider)」に最適なオーバーロードされたメソッドがいくつかの無効な引数を持っています」と2)「引数1: void 'を'オブジェクト 'に変更します。

これは<%# ... %>の間に書かれているものがConvert.ToString(..., CultureInfo.CurrentCulture)にある単純なケースのようです。それは、おそらくより高度な、別のControlBuilders、TemplateParsers、および1オンスの魔法が関与しているが、私は抽象化がこれを理解するのに十分うまくいくと思う。