C# 基于角色隐藏/显示gridview列

C# 基于角色隐藏/显示gridview列,c#,asp.net,C#,Asp.net,希望能够将“编辑”链接按钮设置为visible=false,除非用户具有“编辑”角色 我们一直在stackoverflow和其他地方进行调查,到目前为止还没有能够使这项工作正常进行 Gridview: <asp:GridView ID="GridView1" runat="server" Caption="Questions Awaiting Review" AllowSorting="True" PagerSettings-Mode="NumericFirstLast" OnP

希望能够将“编辑”链接按钮设置为visible=false,除非用户具有“编辑”角色

我们一直在stackoverflow和其他地方进行调查,到目前为止还没有能够使这项工作正常进行

Gridview:

<asp:GridView ID="GridView1" runat="server" Caption="Questions Awaiting Review" AllowSorting="True" PagerSettings-Mode="NumericFirstLast" 
    OnPageIndexChanging="GridView1_PageIndexChanging" CaptionAlign="Top" EmptyDataText="No Questions Pending Review." 
    PageSize="10" AllowPaging="true" PagerStyle-HorizontalAlign="Center" PagerStyle-Font-Size="Large" DataKeyNames="QuestionID"
    OnRowCommand="GridView1_RowCommand" AutoGenerateColumns="false" AlternatingRowStyle-BackColor="#cccccc"
    OnPreRender="GridView1_OnPreRender">
<Columns>
    <asp:TemplateField>
        <ItemTemplate>
            <asp:Label ID="QuestionID" runat="server" Text='<%# Eval("QuestionID") %>' />
        </ItemTemplate>
    </asp:TemplateField>
    <asp:BoundField DataField="KeyObjective" HeaderText="Key Objective" ItemStyle-Width="250" />
    <asp:BoundField DataField="SubmitDate" HeaderText="Submitted Date" ItemStyle-Width="60" />
    <asp:TemplateField>
    <ItemTemplate>
        <asp:LinkButton ID="Details" CommandArgument='<%# Eval("QuestionID") %>' runat="server" CommandName="viewQuestion">View Question</asp:LinkButton>
    </ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
     <ItemTemplate>
        <asp:LinkButton ID="Edit" CommandArgument='<%# Eval("QuestionID") %>' runat="server" CommandName="editQuestion">Edit Question</asp:LinkButton>
    </ItemTemplate>
</asp:TemplateField>
</Columns>

</asp:GridView>
希望我错过了一些简单的、asp.net的新内容,所以不太可能。

隐藏最后一列

this.GridView1.Columns[this.GridView1.Columns.Count - 1].Visible = Roles.IsUserInRole("Editor");

像这样使用LinkButton,从code behind中的函数设置
可见性
属性

<asp:LinkButton ID="Edit" Visible='<%# ShowEditBasedOnRole() %>' CommandArgument='<%# Eval("QuestionID") %>' runat="server" CommandName="editQuestion">Edit Question</asp:LinkButton>

您希望显示/隐藏整个列,而不是LinkButton控件。否则,未经授权的用户将始终看到一列空白单元格,这是奇数

以下示例将隐藏整个列

屏幕截图(授权与未授权)

ASPX

编辑问题
代码隐藏
公开课问题
{
public int QuestionID{get;set;}
公共字符串KeyObjective{get;set;}
}
公共部分类默认值:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!IsPostBack)
{
GridView1.DataSource=新列表
{
新问题{QuestionID=1,KeyObjective=“One”},
新问题{QuestionID=2,KeyObjective=“Two”},
新问题{QuestionID=3,KeyObjective=“三”},
};
GridView1.DataBind();
}
}
受保护的void GridView1_OnPreRender(对象发送方,事件参数e)
{
bool isEditor=true;//此处为业务逻辑
如果(iEdit)
{
//输入正确的列索引。
GridView1.Columns[2]。Visible=false;
}
}
}

一次快速修改,而不是按索引访问列。可以使用标题文本访问它,这不会影响代码,即使在以后的代码段中在访问的列之前插入了新列

protected void grdResults_OnPreRender(object sender, EventArgs e)
{
    TemplateField FieldToAccess= grdResults.Columns.OfType<TemplateField> 
                                 ().Where(f => f.HeaderText == 
                                 "ValidityDate").FirstOrDefault();
    if (role)
    FieldToAccess.Visible = false;
}
protectedvoid grdResults\u OnPreRender(对象发送方,事件参数e)
{
TemplateField FieldToAccess=grdResults.Columns.OfType
()其中(f=>f.HeaderText==
“有效期”).FirstOrDefault();
如果(角色)
FieldToAccess.Visible=false;
}

在this.GridView1.DataBind()之后;不必在数据绑定后发生。与行不同,列不依赖于数据的存在。因此,在Page_Init之后的任何地方,它也是一个非常好的解决方案,也许比操纵列更好。这里唯一的问题是,即使已清空,列仍然可见:
returnroles.IsUserInRole(“编辑器”)如果
/
则否
,否则是必需的。@Andrei,你说得对,错过了那部分。我用第一句话作为指导(
将“Edit”linkbutton设置为visible=false,除非..
),而不是像您在这里概述的过程那样的标题,并且同意完全删除列比打开一个大洞更好。但是,不确定要在“业务日志此处”区域中放入什么来检查登录用户是否是角色“编辑器”的成员。已将此添加到隐藏的代码中:受保护的void GridView1_OnPreRender(对象发送方,事件参数e){if(Roles.IsUserInRole(“编辑器”)){//输入正确的列索引。GridView1.Columns[4]。Visible=true;}否则{GridView1.Columns[4]。Visible=false;}但是,现在我收到一个错误,说没有启用角色管理。检查了Nuget软件包,并且安装了Microsoft.Aspnet.Identity.Core软件包。不确定如何在web.config.No中启用此功能,我收到一个错误,说:System.web.dll中发生了类型为“System.Configuration.Provider.ProviderException”的异常,但未成功引入用户代码附加信息:尚未启用角色管理器功能。未启用角色管理-错误消息与原始问题完全不同。请使用必要的代码创建一个新问题,以便我们可以查看它。看起来我已经解决了角色管理问题(没有更多错误),但是,即使用户是编辑器角色的成员,该列仍处于隐藏状态。上面的代码现在正在运行,不确定更改了什么以便正确计算,但我接受它!
public bool ShowEditBasedOnRole()
{
    if (Roles.IsUserInRole("Editor"))
    {
        return true;
    }
    else
    {
        return false;
    }
}
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="DemoWebForm.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:GridView ID="GridView1"
            runat="server"
            DataKeyNames="QuestionID"
            OnPreRender="GridView1_OnPreRender"
            AutoGenerateColumns="false">
            <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:Label ID="QuestionID" runat="server" Text='<%# Eval("QuestionID") %>' />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="KeyObjective" HeaderText="Key Objective" ItemStyle-Width="250" />
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:LinkButton ID="Edit" CommandArgument='<%# Eval("QuestionID") %>'
                            runat="server" CommandName="editQuestion">Edit Question</asp:LinkButton>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </form>
</body>
</html>
public class Question
{
    public int QuestionID { get; set; }
    public string KeyObjective { get; set; }
}

public partial class Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            GridView1.DataSource = new List<Question>
            {
                new Question {QuestionID = 1, KeyObjective = "One"},
                new Question {QuestionID = 2, KeyObjective = "Two"},
                new Question {QuestionID = 3, KeyObjective = "Three"},
            };
            GridView1.DataBind();
        }
    }

    protected void GridView1_OnPreRender(object sender, EventArgs e)
    {
        bool isEditor = true; // Business logic here
        if (isEditor)
        {
            // Enter correct column index.
            GridView1.Columns[2].Visible = false;
        }
    }

}
protected void grdResults_OnPreRender(object sender, EventArgs e)
{
    TemplateField FieldToAccess= grdResults.Columns.OfType<TemplateField> 
                                 ().Where(f => f.HeaderText == 
                                 "ValidityDate").FirstOrDefault();
    if (role)
    FieldToAccess.Visible = false;
}