簡體   English   中英

簡單的用戶控件,可有條件地呈現嵌套的HTML

[英]Simple user control for conditionally rendering nested HTML

我想做的是能夠將兩個屬性傳遞給用戶控件,即ListName和Permission,如下所示:

<uc:check id="uc" List="Shared Documents" Permission="OpenItems" runat="server">
  <!-- have some HTML content here that is rendered if the permission is true -->
</uc:check>

然后在實際檢查用戶控件中,進行以下操作:

<%@ Control language="C#" ClassName="check" %>
<% 
  // determine permission magic placeholder
  if (DoesUserHavePermissions(perm))
  {
    // render nested HTML content
  }
  else
  {
    // abort rendering as to not show nested HTML content
  }
%>

我已經閱讀了有關在MSDN創建模板控件的頁面 ,盡管可以正常工作-對於我想做的事情,這似乎有些過頭了。 是否存在已經基於布爾表達式或更簡單的模板示例呈現內容的控件?

http://msdn.microsoft.com/en-us/library/36574bf6.aspx

更新:

可以在ascx中使用以下代碼來對此建模非常簡單:

<%@ Control Language="C#" ClassName="PermissionCheck" %>
<%@ Import Namespace="System.ComponentModel"  %>
<script runat="server">
    void Page_Init()
    {
        if (Allowed != null)
        {
            Panel container = new Panel();
            Allowed.InstantiateIn(container);
            PermissionBasedMessage.Controls.Add(container);
        }
    }

    [PersistenceMode(PersistenceMode.InnerProperty)]
    public ITemplate Allowed { get; set; }
</script>
<asp:Placeholder runat="server" ID="PermissionBasedMessage" />

注意:我簡化了此示例代碼的Page_Init方法中的檢查。 可以根據需要添加其他邏輯檢查。

並在調用HTML頁面中引用它:

<%@ Register src="PermissionCheck.ascx" tagname="PermissionCheck" tagprefix="uc1" %>

<uc1:PermissionCheck ID="PermissionCheck1" runat="server">
  <Allowed>Allowed Access</Allowed>
</uc1:PermissionCheck>

您可以創建一個自定義控件而不是用戶控件:從asp.net面板派生,添加兩個屬性,然后僅在用戶具有所需權限時才呈現該控件。 例如這樣的事情:

控件(例如,將其放入App_Code中):

namespace MyControls
{
    public class MyPanel : Panel
    {
        public string Permission { get; set; }
        public string List { get; set; }
        protected override void Render(System.Web.UI.HtmlTextWriter writer)
        {
            if (UserHasPermission()) base.Render(writer);
        }
    }
}

使用控件:

<%@ Page ... %>
<%@ Register Namespace="MyControls" TagPrefix="mc" %>
<html>
...
    <mc:MyPanel runat="server" List="Shared Documents" Permission="OpenItems">
        put content and/or other controls here
    </mc:MyPanel>
...

為什么不擴展LiteralControl,為設置添加屬性,然后將html呈現為LieralControl的.Value? 與使用模板控件相比,看起來非常簡單,而且省去了很多麻煩

用占位符控件包裝內容,並將控件的可見性設置為true或false(具有.Visible = false的控件將不會呈現任何html)

<asp:PlaceHolder id =“ phWrapper” runat =“ server”>
...
</ ASP:占位符>

然后在您的代碼隱藏集中設置phWrapper.Visible = DidUserUserHavePermissions(perm);

希望有幫助!

其他答案對您問題的一般形式很好,但是對於檢查權限,SPSecurityTrimmedControl可能會滿足您的要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM