C# 基于角色隐藏/显示gridview列
希望能够将“编辑”链接按钮设置为visible=false,除非用户具有“编辑”角色 我们一直在stackoverflow和其他地方进行调查,到目前为止还没有能够使这项工作正常进行 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
<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;
}