C#管理a赠款
我对为两个/三个不同区域启用的用户管理授权有问题,例如,具有此配置文件的用户我没有问题:C#管理a赠款,c#,grant,C#,Grant,我对为两个/三个不同区域启用的用户管理授权有问题,例如,具有此配置文件的用户我没有问题: User = Foo Area = East Level = 2 相反,对于用户配置文件: User = Pluto Area = East Area = West Level = 2 根据成员区域和预期级别(0、1和2)对授权用户表执行访问控制的语句Users(),只考虑西区用户Pluto,而不同时启用东区和西区 下面是我的代码 任何帮助都将不胜感激,提前谢谢 protected voi
User = Foo
Area = East
Level = 2
相反,对于用户配置文件:
User = Pluto
Area = East
Area = West
Level = 2
根据成员区域和预期级别(0、1和2)对授权用户表执行访问控制的语句Users(),只考虑西区用户Pluto,而不同时启用东区和西区
下面是我的代码
任何帮助都将不胜感激,提前谢谢
protected void Users()
{
using (OdbcConnection conn =
new OdbcConnection(ConfigurationManager.ConnectionStrings["cn"].ConnectionString))
{
sql = " SELECT * FROM ";
sql = sql + " tblUsers ";
sql = sql + " WHERE (Email = ? ";
sql = sql + " AND degree IS NOT NULL); ";
using (OdbcCommand command =
new OdbcCommand(sql, conn))
{
try
{
command.Parameters.AddWithValue("param1", Server.UrlDecode(Request.Cookies["email"].Value));
command.Connection.Open();
using (OdbcDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
degree = reader["degree"].ToString();
area = reader["Area"].ToString();
}
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
command.Connection.Close();
}
}
}
}
编辑1
string Level;
string Area;
public class GrantUser
{
public string Area { get; set; }
public string Level { get; set; }
public GrantUser() { }
public GrantUser(string Area, string Level)
{
this.Area = Area;
this.Level = Level;
}
}
protected void Users()
{
using (OdbcConnection conn =
new OdbcConnection(ConfigurationManager.ConnectionStrings["cn"].ConnectionString))
{
sql = " SELECT * FROM tblUsers WHERE (Email = ? AND Level IS NOT NULL); ";
using (OdbcCommand command =
new OdbcCommand(sql, conn))
{
try
{
command.Parameters.AddWithValue("param1", Server.UrlDecode(Request.Cookies["email"].Value));
command.Connection.Open();
List<GrantUser> lsGrantUser = new List<GrantUser>();
using (OdbcDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Level = reader["Level"].ToString();
Area = reader["Area"].ToString();
lsGrantUser.Add(new GrantUser(reader["Area"].ToString(), reader["Level"].ToString()));
}
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
command.Connection.Close();
}
}
}
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
Label area = (Label)e.Row.FindControl("Area");
if (!string.IsNullOrEmpty(Level.ToString()))
{
if (Level.ToString() == "0")
{
//here the condition 0
}
if (Level.ToString() == "1")
{
if (area.Text == Area.ToString())
{
//here the condition 1
}
}
if (Level.ToString() == "2")
{
if (area.Text == Area.ToString())
{
//here the condition 2
}
}
}
}
}
public DataTable GridViewBind()
{
sql = " SELECT ....... ; ";
try
{
dadapter = new OdbcDataAdapter(sql, conn);
dset = new DataSet();
dset.Clear();
dadapter.Fill(dset);
DataTable dt = dset.Tables[0];
GridView1.DataSource = dt;
conn.Open();
GridView1.DataBind();
if (dt.Rows.Count == 0)
{
Page.ClientScript.RegisterStartupScript(this.GetType(), "Alert", "alert('No data.');", true);
}
return dt;
}
catch (Exception ex)
{
throw ex;
}
finally
{
dadapter.Dispose();
dadapter = null;
conn.Close();
}
}
如果我理解你的问题,听起来你有
区域
属性,它可以有很多不同的值,比如“东”、“西”,我会假设“北”和“南”(或类似的值)
在这种情况下,我将从如下枚举开始:
enum Areas
{
East, West, North, South
}
然后将区域
的类型从字符串
更改为区域
:
public class GrantUser
{
public Areas Area { get; set; }
public string Level { get; set; }
public GrantUser() { }
public GrantUser(Areas Area, string Level)
{
this.Area = Area;
this.Level = Level;
}
}
现在,您只能将GrantUser.Area
设置为列表中的一个值(否则您将无法编译):
最后,如果您希望用户能够为其分配多个“区域”,那么我们将为枚举赋予一个[Flags]
属性,创建一个默认的None
值,然后为每个项分配一个增加二次方的值(听起来很混乱,但一旦执行了几次,就会感觉正常)。有关详细信息,请选中“”
[Flags]
public enum Areas
{
None = 0, East = 1, West = 2, North = 4, South = 8
}
最后,为了让用户同时访问东部
和西部
,我们只需要将这些区域合并在一起:
GrantUser user = GetUserFromSomewhere();
user.Area = Areas.East | Areas.West; //Gives a value of 3, which is 1 + 2
请注意,当我们计算二次幂或二次幂时,这与将二次幂相加是一样的,但这只是因为二次幂的位排列方式(这是另一个主题)。请注意,一般情况下并非如此。i、 e.:3 | 7==7
现在,要检查用户可以访问的区域,请使用AND运算符:
if(user.Area & Areas.East == Areas.East) {//has access to East}
if(user.Area & Areas.West == Areas.West) {//has access to West}
有关进一步阅读和详细的代码示例,请查看。不要抛出ex
,另外,命令.Connection.Close()
与using
-语句是多余的。实际上,您的try catch finally
是多余的。在哪里声明了程度
和区域
?您应该创建一个至少具有四个属性的类用户
:字符串名称
,字符串度
,列表区域
和内部级别
。重要的是这个名单。谢谢你在公共部分课程上公布的学位和领域。请看我第一篇文章中的编辑1。输出不变。您仍在使用单个级别
和单个区域
,为什么?您已经初始化了本地列表
,但从未使用过它。
GrantUser user = GetUserFromSomewhere();
user.Area = Areas.East | Areas.West; //Gives a value of 3, which is 1 + 2
if(user.Area & Areas.East == Areas.East) {//has access to East}
if(user.Area & Areas.West == Areas.West) {//has access to West}