2016-10-24 8 views
0

私はASP.NETを初めて使用しています。私はWebページのテンプレートに表示したいと思うEktronの以下の.Net Controlを持っています。THIS POSTからの質問に続きます。テンプレートにMy .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は一例です)

をあなたのコントロールのコードでは、任意のパラメータが設定されていないので、上記の罰金に動作します。しかし、少なくとも1つのパラメータを提供することができます。おそらく、コントロールをより再利用可能にするために必要です。

たとえば、あなたのメソッドの呼び出しで75のハードコードされた値を持っています。私はそれがEktron Folder、Taxonomy、Collectionを指していると仮定します。それにかかわらず、それはいくつかのコンテナIDです。このコントロールは、データの異なるソース、つまり異なるコンテナIDを持つ複数の場所で使用できます。これを設定した方法は、その値を更新するたびに新しいコントロールを作成する必要があります。

だから、私たちはあなたのコントロールにパブリックプロパティを追加した場合、コードビハインドているので、次のようになります。

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(); 
     } 
    } 
} 

いつでもどこでもあなたがコントロールを配置するとあなたは、コンテナIDを指定することができます。

<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

関連する問題