2016-10-24 3 views
0

Я новичок в ASP.NET. В качестве последующего вопроса от THIS POST У меня есть следующий .Net Control в Ektron, который я хотел бы отобразить в своем шаблоне веб-страницы.Вставить мой элемент управления .NET в шаблон

управления:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Gallery.ascx.cs" Inherits="Source_Controls_Alumni_Gallery" %> 
<asp:ListView ID="uxPhotoGallery" runat="server" ItemPlaceholderID="itemPlaceholder"> 
    <LayoutTemplate> 
     <ul> 
      <asp:PlaceHolder ID="itemPlaceholder" runat="server" /> 
     </ul> 
    </LayoutTemplate> 
    <ItemTemplate> 
     <li> 
      <%-- 
       I'm mixing up two different ways of referencing the incoming data. One is by casting 
       the DataItem to the incoming type, which gives you intellisense access to the properties. 

       The other is more of a dictionary approach in which you have to type out the property name 
       as a string. 

       I really like the casting approach, but it's mega-wordy. 
       --%> 
      <a href="<%#((Ektron.Custom.ViewModels.PressPhotoViewModel)Container.DataItem).ImageUrl %>"> 
       <img src="<%#((Ektron.Custom.ViewModels.PressPhotoViewModel)Container.DataItem).ImageUrl %>" alt="<%#Eval("Description") %>" /> 
       <div><%#Eval("Description") %></div> 
      </a> 
     </li> 
    </ItemTemplate> 
</asp:ListView> 

и код позади:

using Ektron.Custom.SmartForms; 
using System; 
using System.Linq; 

public partial class Source_Controls_Alumni_Gallery : System.Web.UI.UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     var pressPhotoManager = new PressPhotoManager(); 

     // Whichever folder Id... 
     var photos = pressPhotoManager.GetList(75); 

     if (photos != null && photos.Any()) 
     { 
      uxPhotoGallery.DataSource = photos; 
      uxPhotoGallery.DataBind(); 
     } 
    } 
} 

Я хотел бы, чтобы вставить элемент в этот шаблон:

<%@ Page Title="" Language="C#" MasterPageFile="~/Source/Masterpages/MainMaster.master" AutoEventWireup="true" CodeFile="AlumniJobOpenings.aspx.cs" Inherits="Source_Templates_AlumniJobOpenings" %> 

<%@ Register Src="~/Source/Controls/SubHeader.ascx" TagPrefix="uc1" TagName="SubHeader" %> 
<%@ Register Src="~/Source/Controls/Shared/PrimarySection.ascx" TagPrefix="uc1" TagName="PrimarySection" %> 
<%@ Register Src="~/Source/Controls/JoinUs/StaffAndParalegals/SPOpenings.ascx" TagPrefix="uc1" TagName="SPOpenings" %> 
<%@ Register Src="~/Source/Controls/JoinUs/StaffAndParalegals/SPFilters.ascx" TagPrefix="uc1" TagName="SPFilters" %> 
<%@ Register Src="~/Source/Controls/Shared/RelatedContentModules.ascx" TagPrefix="uc1" TagName="RelatedContentModules" %> 
<%@ Register Src="~/Source/Controls/JoinUs/StaffAndParalegals/SPContactDetails.ascx" TagPrefix="uc1" TagName="SPContactDetails" %> 
<%@ Register Src="~/Source/Controls/Shared/TextImageAssetBlockModules.ascx" TagPrefix="uc1" TagName="TextImageAssetBlockModules" %> 
<%@ Register Src="~/Source/Controls/Shared/TextLinkBlockControl.ascx" TagPrefix="uc1" TagName="TextLinkBlockControl" %> 
<%@ Register TagPrefix="sp" TagName="Spinner" Src="~/Source/Controls/Alumni/Gallery.ascx" %> 




<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> 
    <uc1:SubHeader runat="server" ID="SubHeader" /> 
    <div class="container non-responsive"> 
     <div class="row"> 
      <div class="col-sm-8 alpha"> 
       <uc1:PrimarySection runat="server" ID="PrimarySection" /> 
       <div class="primary"> 
        <div class="container non-responsive"> 
         <div class="row"> 
          <div class="col-sm-8 alpha"> 
           <div class="primary"> 
            IMAGE GALLERY LIST SHOULD BE INSERTED HERE. 
           </div> 
          </div> 
          <div class="col-sm-4 beta"> 
          </div> 
         </div> 
        </div> 
       </div> 
      </div> 
      <div class="col-sm-4 beta"> 
       <uc1:SPContactDetails runat="server" ID="SPContactDetails" /> 
       <uc1:SPFilters runat="server" ID="SPFilters" Heading="Staff and Paralegal Openings" Text="Select an office below to learn more about current opportunities" /> 
       <uc1:RelatedContentModules runat="server" ID="RelatedContentModules" /> 
       <uc1:TextLinkBlockControl runat="server" ID="TextLinkBlockControl" /> 
       <uc1:TextImageAssetBlockModules runat="server" ID="TextImageAssetBlockModules" /> 
      </div> 
     </div> 
    </div> 
</asp:Content> 

ответ

1

Вот ваша линия от вершины:

<%@ Register TagPrefix="sp" TagName="Spinner" Src="~/Source/Controls/Alumni/Gallery.ascx" %> 

И подобная линия используется для регистрации другого элемента управления в одной и той же странице:

<%@ Register Src="~/Source/Controls/SubHeader.ascx" TagPrefix="uc1" TagName="SubHeader" %> 

Теперь посмотрим на размещение управления для предварительно существующего элемента, указанным выше.

<uc1:SubHeader runat="server" ID="SubHeader" /> 

То, что вы найдете то, что тег размещения состоит из настроенных свойств в <%@ Register ... %> линии. В частности, значения TagPrefix и TagName. Вы будете использовать эти значения, чтобы создать свое собственное размещение управления, после этого формата:

<TagPrefix:TagName runat="server" ID="SomeUniqueID" [optional parameters] /> 

Таким образом, в случае вашего контроля, вы установили TagPrefix="sp" и TagName="Spinner". Таким образом, ваше размещение управления будет выглядеть следующим образом:

<sp:Spinner runat="server" ID="uxAlumniSpinner" /> 

(ID пример)

из кода управления, не имеют каких-либо параметров настройки таким образом, выше, будет работать нормально. Но вы могли бы предоставить хотя бы один параметр и, вероятно, должны были бы сделать управление более многоразовым.

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

Так что, если мы добавим публичную собственность вашего контроля, так что код-за выглядит следующим образом:

using Ektron.Custom.SmartForms; 
using System; 
using System.Linq; 

public partial class Source_Controls_Alumni_Gallery : System.Web.UI.UserControl 
{ 

    // Added Property 
    private long _containerId = 0; 
    public long ContainerID { 
     get { return _containerId; } 
     set { _containerId = value; } 
    } 
    ///////// 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     // Added inverted conditional to escape method 
     // if the _containerId is invalid. 
     if(_containerId <= 0) return; 
     /////////// 

     var pressPhotoManager = new PressPhotoManager(); 

     // Whichever folder Id... 
     var photos = pressPhotoManager.GetList(_containerId); 

     if (photos != null && photos.Any()) 
     { 
      uxPhotoGallery.DataSource = photos; 
      uxPhotoGallery.DataBind(); 
     } 
    } 
} 

Затем можно указать идентификатор контейнера, когда и где вы размещаете контроль. Как так:

<sp:Spinner runat="server" ID="uxAlumniSpinner" ContainerID="75" /> 

Создание окончательного в-шаблон разметки:

<%@ Register Src="~/Source/Controls/JoinUs/StaffAndParalegals/SPContactDetails.ascx" TagPrefix="uc1" TagName="SPContactDetails" %> 
<%@ Register Src="~/Source/Controls/Shared/TextImageAssetBlockModules.ascx" TagPrefix="uc1" TagName="TextImageAssetBlockModules" %> 
<%@ Register Src="~/Source/Controls/Shared/TextLinkBlockControl.ascx" TagPrefix="uc1" TagName="TextLinkBlockControl" %> 
<%@ Register TagPrefix="sp" TagName="Spinner" Src="~/Source/Controls/Alumni/Gallery.ascx" %> 


<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> 
    <uc1:SubHeader runat="server" ID="SubHeader" /> 
    <div class="container non-responsive"> 
     <div class="row"> 
      <div class="col-sm-8 alpha"> 
       <uc1:PrimarySection runat="server" ID="PrimarySection" /> 
       <div class="primary"> 
        <div class="container non-responsive"> 
         <div class="row"> 
          <div class="col-sm-8 alpha"> 
           <div class="primary"> 
            <sp:Spinner runat="server" ID="uxAlumniSpinner" ContainerID="75" /> 
           </div> 
          </div> 
          <div class="col-sm-4 beta"> 
          </div> 
         </div> 
        </div> 
       </div> 
      </div> 
      <div class="col-sm-4 beta"> 
       <uc1:SPContactDetails runat="server" ID="SPContactDetails" /> 
       <uc1:SPFilters runat="server" ID="SPFilters" Heading="Staff and Paralegal Openings" Text="Select an office below to learn more about current opportunities" /> 
       <uc1:RelatedContentModules runat="server" ID="RelatedContentModules" /> 
       <uc1:TextLinkBlockControl runat="server" ID="TextLinkBlockControl" /> 
       <uc1:TextImageAssetBlockModules runat="server" ID="TextImageAssetBlockModules" /> 
      </div> 
     </div> 
    </div> 
</asp:Content> 
+0

Должен ли 75 еще в коде позади? не должно быть var photos = pressPhotoManager.GetList (ContainerID); ? – fred1234

+1

К сожалению. Исправленный. Вы можете использовать _containerId или ContainerID в методе Page_Load и в другом месте вашего пользовательского кода. Просто будьте последовательны в этом.Не используйте _containerId в одном месте и ContainerID в другом. Основной целью ContainerID является публичное свойство, которое вы можете настроить в своем размещенном элементе управления. – egandalf

Смежные вопросы