Практическое руководство. Создание ссылок-действий в таблице платформы динамических данных

Платформа динамических данных ASP.NET позволяет создавать динамические гиперссылки, основанные на действиях таблицы, которые предоставляются платформой динамических данных. При щелчке ссылки отображается веб-страница, которая позволяет пользователю выполнить действие, указанное в ссылке (например, вывести список детализированных строк данных или изменить элемент данных).

В этом разделе показано, как создавать динамические гиперссылки платформы динамических данных с помощью элемента управления DynamicHyperLink в следующих сценариях:

  • Ссылки-действия в строках таблицы для элементов управления с привязкой к данным. Эти ссылки-действия относятся к строкам данных в элементе управления с привязкой к данным, например в Edit или Details. Платформа динамических данных выводит тип таблицы и первичный ключ из строки таблицы.

  • Ссылки-действия мета-таблиц для элементов управления с привязкой к данным. Эти ссылки-действия класса MetaTable относятся к таблицам в элементе управления с привязкой к данным, например в List или Insert.

  • Несвязанные ссылки-действия. Эти ссылки-действия не связаны с конкретным элементом управления с привязкой к данным. Для этих ссылок необходимо определить таблицу, к которой они будут обращаться, и действие, которое необходимо выполнить.

Создание ссылок-действий в строках таблицы элемента управления с привязкой к данным

  1. В Visual Studio 2010 или Visual Web Developer 2010, экспресс-выпуск создайте или откройте веб-сайт на платформе динамических данных.

  2. Создайте или откройте веб-страницу ASP.NET.

  3. Добавьте элемент управления DynamicDataManager на страницу, как показано в следующем примере.

    <body>
      <form ID="Form1" runat="server">
        <asp:DynamicDataManager ID="DynamicDataManager1"
          runat="server"/>
      </form>
    </body>
    

    Для поддержки страницей элементов управления платформы динамических данных необходимо добавить на нее элемент управления DynamicDataManager. Разметка элемента управления DynamicDataManager должна предшествовать разметке любых других элементов управления, использующих платформу динамических данных.

  4. Добавьте на страницу элемент управления источником данных и настройте его на обращение к таблице данных, в которой необходимо создать ссылки-действия.

    В следующем примере показана разметка элемента управления LinqDataSource, настроенного на обращение к таблице Products базы данных AdventureWorksLT.

    <asp:LinqDataSource ID="LinqDataSource1"  runat="server"  
      ContextTypeName="AdventureWorksLTDataContext"
      TableName="Products"/>
    
  5. Добавьте элемент управления с привязкой к данным, поддерживающий шаблоны.

    В следующем примере показана разметка элемента управления GridView, настроенного на отображение данных из элемента управления LinqDataSource.

    <asp:GridView ID="GridView1" DataSourceID=" LinqDataSource1" runat="server">
    </asp:GridView>
    
  6. Добавьте элемент управления DynamicHyperLink в шаблон элемента управления с привязкой к данным TemplateField.

    В следующем примере показана разметка, которая создает ссылку Edit (правка) для каждой строки связанной таблицы.

    <asp:GridView ID="GridView1" DataSourceID="LinqDataSource1" 
        runat="server">
      
      <Columns>
        <asp:TemplateField>
          <ItemTemplate>
            <asp:DynamicHyperLink runat="server" 
              ID="EditHyperLink" 
              Action="Edit" 
              Text="Edit"/>
          </ItemTemplate>
        </asp:TemplateField>
      </Columns>
      
    </asp:GridView>
    

    Когда пользователь щелкает ссылку Edit, платформа динамических данных отображает страницу, которая использует шаблон страницы по умолчанию Edit.aspx для визуализации элемента пользовательского интерфейса, отвечающего за изменение связанной строки.

  7. Зарегистрируйте элемент управления с привязкой к данным вместе с элементом DynamicDataManager, как показано в следующем примере.

    <asp:DynamicDataManager ID="DynamicDataManager1"
      runat="server">
      <DataControls>
        <asp:DataControlReference ControlID="GridView1"/>
      <DataControls>
    </asp:DynamicDataManager>
    

    Элемент управления DynamicDataManager указывает платформе динамических данных, что зарегистрированные элементы управления с привязкой к данным необходимо обрабатывать как динамические.

  8. Сохраните и закройте эту страницу.

Создание ссылок-действий мета-таблиц для элементов управления с привязкой к данным

  1. В Visual Studio 2010 или Visual Web Developer 2010, экспресс-выпуск создайте или откройте веб-сайт на платформе динамических данных.

  2. Создайте или откройте веб-страницу ASP.NET. Убедитесь, что страница имеет связанный файл класса с выделенным кодом.

  3. Добавьте на страницу элемент управления DynamicDataManager, как показано в следующем примере.

    <body>
      <form ID="Form1" runat="server">
        <asp:DynamicDataManager ID="DynamicDataManager1"
          runat="server"/>
      </form>
    </body>
    

    Для поддержки страницей элементов управления платформы динамических данных необходимо добавить на нее элемент управления DynamicDataManager. Разметка элемента управления DynamicDataManager должна предшествовать разметке любых других элементов управления, использующих платформу динамических данных.

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

    В следующем примере показана разметка элемента управления LinqDataSource, настроенного на обращение к таблицам базы данных AdventureWorksLT.

    <asp:LinqDataSource ID="LinqDataSource1" runat="server" 
      ContextTypeName="AdventureWorksLTDataContext">
    </asp:LinqDataSource>
    
  5. Добавьте элемент управления с привязкой к данным, поддерживающий шаблоны.

    В следующем примере показана разметка элемента управления GridView, настроенного на отображение данных из элемента управления LinqDataSource с именем LinqDataSource1.

    <asp:GridView ID="GridView1" DataSourceID="LinqDataSource1" runat="server">
    </asp:GridView>
    
  6. Добавьте элемент управления DynamicHyperLink в шаблон элемента управления с привязкой к данным TemplateField.

    В следующем примере показана разметка, которая создает ссылки для каждой таблицы коллекции.

    <asp:GridView ID="GridView1" DataSourceID="LinqDataSource1" runat="server"/> 
      <Columns>
        <asp:TemplateField HeaderText="Table Name" >
          <ItemTemplate>
            <asp:DynamicHyperLink ID="DynamicHyperLink1" 
                runat="server"
                TableName='<%# Eval("Name") %>'>
              <%# Eval("DisplayName") %> 
            </asp:DynamicHyperLink>
          </ItemTemplate>
        </asp:TemplateField>
      </Columns> 
    </asp:GridView>
    
  7. Зарегистрируйте элемент управления с привязкой к данным вместе с элементом DynamicDataManager, как показано в следующем примере.

    <asp:DynamicDataManager ID="DynamicDataManager1"
      runat="server">
      <DataControls>
        <asp:DataControlReference ControlID="GridView1"/>
      <DataControls>
    </asp:DynamicDataManager>
    

    Элемент управления DynamicDataManager указывает платформе динамических данных, что зарегистрированные элементы управления с привязкой к данным необходимо обрабатывать как динамические.

  8. Сохраните и закройте эту страницу.

  9. Откройте файл класса с выделенным кодом.

  10. В методе Page_Load привяжите элемент управления с привязкой к данным к коллекции таблиц IList, доступных в платформе динамических данных.

    В этом примере демонстрируется привязка элемента управления GridView1 к коллекции таблиц IList.

    protected void Page_Load(object sender, EventArgs e)
    {
        If (!IsPostBack)
        {
          // Get the list of visible tables.
          System.Collections.IList tables =
              ASP.global_asax.model.VisibleTables;
          // Throw an exception if there are no visible tables.
          if (tables.Count == 0){ 
            throw new InvalidOperationException();
          }
          // Bind the data-bound control to 
          // the list of tables.
          GridView1.DataSource = tables;
          GridView1.DataBind();
        }
    }
    

    Protected Sub Page_Load(ByVal sender As Object, _
            ByVal e As EventArgs)
        If Not IsPostBack Then
          ' Get the list of visible tables.
          Dim tables As System.Collections.IList = _
            ASP.global_asax.L2Smodel.VisibleTables
          ' Throw an exception if there are no visible tables.
          If tables.Count = 0 Then
            Throw New InvalidOperationException()
          End If
          ' Bind the data-bound control to 
          ' the list of tables.
          GridView1.DataSource = tables
          GridView1.DataBind()
        End If
    End Sub
    
  11. Сохраните изменения и закройте файл с выделенным кодом.

Создание несвязанных ссылок-действий

  1. В Visual Studio 2010 или Visual Web Developer 2010, экспресс-выпуск создайте или откройте веб-сайт на платформе динамических данных.

  2. Создайте или откройте веб-страницу ASP.NET.

  3. Добавьте на страницу элемент управления источником данных и настройте его на обращение к таблицам данных, над которыми необходимо выполнять определенные операции.

    В следующем примере показана разметка элемента управления LinqDataSource, который обращается к таблицам базы данных AdventureWorksLT.

    <asp:LinqDataSource ID="LinqDataSource1"  runat="server"  
      ContextTypeName="AdventureWorksLTDataContext">
    </asp:LinqDataSource>
    
  4. Добавьте элемент управления DynamicHyperLink на страницу и настройте его как несвязанную ссылку.

    Несвязанная ссылка — это ссылка-действие, которая не является частью элемента управления с привязкой к данным. Для этих ссылок необходимо определить таблицу, к которой они будут обращаться, и действие, которое необходимо выполнить.

    <asp:DynamicHyperLink ID="DynamicHyperLink1">
        Insert new item
    </asp:DynamicHyperLink>
    
  5. Присвойте свойству Action элемента управления DynamicHyperLink действие, которое необходимо выполнить.

    В следующем примере показано, как задать свойству Action значение Insert.

    <asp:DynamicHyperLink ID="DynamicHyperLink1" 
        Action="Insert">
      Insert new item
    </asp:DynamicHyperLink>
    
  6. Присвойте свойству DynamicHyperLink элемента управления TableName имя таблицы, над которой необходимо выполнять действия.

    В следующем примере показано, как присвоить свойству TableName значение Products.

    <asp:DynamicHyperLink ID="DynamicHyperLink1" 
        Action="Insert" TableName= "Products">
      Insert new item
    </asp:DynamicHyperLink>
    

    Когда пользователь щелкает ссылку Insert (вставка), платформа динамических данных отображает страницу, которая использует шаблон страницы Insert.aspx для визуализации элемента пользовательского интерфейса для вставки нового элемента.

В следующем примере показано, как создавать динамические гиперссылки для следующих сценариев:

  • Ссылки-действия в строках таблицы для элементов управления с привязкой к данным. В примере создаются ссылки Edit (правка) для каждой строки данных таблицы Products. Когда пользователь щелкает ссылку Edit, платформа динамических данных использует шаблон страницы Edit.aspx для визуализации элемента пользовательского интерфейса, отвечающего за изменение связанной строки.

  • Ссылки-действия мета-таблиц для элементов управления с привязкой к данным. В примере создаются ссылки, отображающие коллекцию таблиц, содержащихся в образце базы данных AdventureWorksLT. Когда пользователь щелкает ссылку, платформа динамических данных использует шаблон страницы List.aspx для визуализации элемента пользовательского интерфейса, отвечающего за отображение связанной таблицы.

  • Несвязанные ссылки-действия. В примере создаются ссылки Edit и Insert для таблицы Products, которые не являются частью ни одного элемента управления с привязкой к данным. В примере задается таблица, к которой необходимо обращаться, и действие, которое требуется выполнить. В случае использования ссылки Edit также задается первичный ключ для строки, которую необходимо изменить.


<%@ Page Language="VB" AutoEventWireup="true" CodeFile="DynamicDataDynamicHyperlink.aspx.vb" Inherits="DocSamples_DynamicDataDynamicHyperlink" %>

<%@ Register src="~/DynamicData/Content/GridViewPager.ascx" tagname="GridViewPager" tagprefix="asp" %>

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>Dynamic Hyperlinks</title>
</head>
<body>
    <form id="form1" runat="server">

    <asp:DynamicDataManager  ID="DynamicDataManager1" 
        runat="server">
        <DataControls>
            <asp:DataControlReference ControlID="GridView1" />
        </DataControls>
    </asp:DynamicDataManager>

    <div>
        <h3>Dynamic Hyperlinks</h3>

         <h4>UnBound Control Action Links</h4>

        <asp:DynamicHyperLink ID="InsertHyperLink" runat="server" 
            Action="Insert"   
            ContextTypeName="AdventureWorksLTDataContext"
            TableName="ProductModels">Insert new item
        </asp:DynamicHyperLink>

        <br />

        <asp:DynamicHyperLink ID="DynamicHyperLink2" runat="server" 
            Action="Edit" 
            ContextTypeName="AdventureWorksLTDataContext"
            TableName="ProductModels"  
            ProductModelID="1">Edit item</asp:DynamicHyperLink>

        <h4>Data-Bound Control Meta-Table Action Links</h4>

        <asp:GridView ID="GridView2" runat="server" 
            AutoGenerateColumns="false"
            CellPadding="6">
            <Columns>
               <asp:TemplateField HeaderText="Table Name" 
                    SortExpression="TableName">
                    <ItemTemplate>                   
                        <asp:DynamicHyperLink 
                            ID="DynamicHyperLink1" runat="server">
                            <%# Eval("DisplayName") %>
                        </asp:DynamicHyperLink>
                    </ItemTemplate>
                </asp:TemplateField>    
            </Columns>
        </asp:GridView>


        <h4>Data-Bound Control Table Row Action Links</h4>

        <asp:GridView ID="GridView1" runat="server" 
            AllowPaging="true" PageSize="5"
            DataSourceID="LinqDataSource1">
            <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:DynamicHyperLink ID="EditHyperLink" 
                            runat="server"  
                            Action="Edit" Text="Edit" />       
                    </ItemTemplate> 
                </asp:TemplateField>    
            </Columns>
        </asp:GridView>



       <asp:LinqDataSource ID="LinqDataSource1" runat="server" 
            ContextTypeName="AdventureWorksLTDataContext"
            TableName="Products"/>

    </div>
    </form>
</body>
</html>



<%@ Page Language="C#" AutoEventWireup="true" CodeFile="DynamicDataDynamicHyperlink.aspx.cs" Inherits="DocSamples_DynamicDataDynamicHyperlink" %>

<%@ Register src="~/DynamicData/Content/GridViewPager.ascx" tagname="GridViewPager" tagprefix="asp" %>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Dynamic Hyperlinks</title>
</head>
<body>
    <form id="form1" runat="server">

    <asp:DynamicDataManager  ID="DynamicDataManager1" 
        runat="server">
        <DataControls>
            <asp:DataControlReference ControlID="GridView1" />
        </DataControls>
    </asp:DynamicDataManager>

    <div>
        <h3>Dynamic Hyperlinks</h3>

         <h4>UnBound Control Action Links</h4>

        <asp:DynamicHyperLink ID="InsertHyperLink" runat="server" 
            Action="Insert"   
            TableName="ProductModels">Insert new item
        </asp:DynamicHyperLink>

        <br />

        <asp:DynamicHyperLink ID="DynamicHyperLink2" runat="server" 
            Action="Edit" 
            TableName="ProductModels"  
            ProductModelID="1">Edit item</asp:DynamicHyperLink>

        <h4>Data-Bound Control Meta-Table Action Links</h4>

        <asp:GridView ID="GridView2" runat="server" 
            AutoGenerateColumns="false"
            CellPadding="6">
            <Columns>
               <asp:TemplateField HeaderText="Table Name" 
                    SortExpression="TableName">
                    <ItemTemplate>
                        <asp:DynamicHyperLink ID="DynamicHyperLink1" 
                            runat="server"  
                            OnDataBinding="DynamicHyperLink_DataBinding"
                            TableName='<%# Eval("Name") %>'>
                                <%# Eval("DisplayName") %>
                        </asp:DynamicHyperLink>     
                    </ItemTemplate> 
                </asp:TemplateField>    
            </Columns>
        </asp:GridView>


        <h4>Data-Bound Control Table Row Action Links</h4>

        <asp:GridView ID="GridView1" runat="server" 
            AllowPaging="true" PageSize="5"
            DataSourceID="LinqDataSource1">
            <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:DynamicHyperLink ID="EditHyperLink" 
                            runat="server"  
                            Action="Edit" Text="Edit" />       
                    </ItemTemplate> 
                </asp:TemplateField>    
            </Columns>
        </asp:GridView>



       <asp:LinqDataSource ID="LinqDataSource1" runat="server" 
            ContextTypeName="AdventureWorksLTDataContext"
            TableName="Products"/>

    </div>
    </form>
</body>
</html>



Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.DynamicData

Partial Public Class DocSamples_DynamicDataDynamicHyperlink
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
        If Not IsPostBack Then
            ' Get the list of visible tables.
            Dim tables As System.Collections.IList = _
            ASP.global_asax.model.VisibleTables

            ' Throw an exception if there are no visible tables.
            If tables.Count = 0 Then
                Throw New InvalidOperationException()
            End If

            ' Bind the data-bound control to 
            ' the list of tables.
            GridView2.DataSource = tables
            GridView2.DataBind()
        End If
    End Sub

    Protected Sub DynamicHyperLink_DataBinding( _
    ByVal sender As Object,ByVal e As EventArgs)
        Dim table As MetaTable = DirectCast(GetDataItem(), MetaTable)
        Dim dynamicHyperLink As DynamicHyperLink = _
        DirectCast(sender, DynamicHyperLink)
        ' Set the context type name for the DynamicHyperLink.
        dynamicHyperLink.ContextTypeName = _
        table.DataContextType.AssemblyQualifiedName
    End Sub
End Class



using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.DynamicData;

public partial class DocSamples_DynamicDataDynamicHyperlink : 
    System.Web.UI.Page
{

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            // Get the list of visible tables.
            System.Collections.IList tables =
                ASP.global_asax.model.VisibleTables;

            // Throw an exception if there are no visible tables.
            if (tables.Count == 0)
            {
                throw new InvalidOperationException();
            }

            // Bind the data-bound control to 
            // the list of tables.
            GridView2.DataSource = tables;
            GridView2.DataBind();
        }
    }

    protected void DynamicHyperLink_DataBinding(object sender,
        EventArgs e)
    {
        MetaTable table = (MetaTable)GetDataItem();
        DynamicHyperLink dynamicHyperLink =
            (DynamicHyperLink)sender;
        // Set the context type name for the DynamicHyperLink 
        dynamicHyperLink.ContextTypeName =
            table.DataContextType.AssemblyQualifiedName;
    }
}


Для выполнения этого примера требуются следующие компоненты:

Показ: