Ключевое слово «Контейнер» для пользовательских элементов управления ASP.NET - PullRequest
0 голосов
/ 01 февраля 2011

Я работаю с шаблонным пользовательским контролем.В окончательной разметке элемента управления данные доступны по ключевому слову Container .Я свободно использую слово «ключевое слово», потому что я не понимаю, является ли это ключевым словом или откуда происходит слово «Контейнер».Ниже приведен пример из моей книги.

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

1 Ответ

0 голосов
/ 01 февраля 2011

Мой пример кода выглядит следующим образом:

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

Intellisense утверждает, что Контейнер является полем / переменной типа 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 - это переменная, подверженная значению intellisense.Это также показывает, что есть переменная target, которая не отображается в intellisense, но компилируется без проблем.Обратите внимание, что это также дает вам доступ ко всему частному в сгенерированном классе, например, __fileDependencies.

<%# target %> работает, а <%# dummy %> - нет.И хотя при этом <%# __DataBind__control4(null, null) %> создает две ошибки компиляции, 1) «Наилучшее перегруженное соответствие метода для System.Convert.ToString (object, System.IFormatProvider)» имеет недопустимые аргументы »и 2)« Аргумент 1: невозможно преобразоватьот 'пустоты' до 'объекта' ".

Это выглядит как простой случай того, что написано между <%# ... %>, помещается в Convert.ToString(..., CultureInfo.CurrentCulture).Вероятно, он более продвинутый, включает в себя различные ControlBuilders, TemplateParsers и унцию магии, но я думаю, что моя абстракция работает достаточно хорошо, чтобы понять это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...