You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据用户登录角色在ASP.NET MVC视图中展示对应操作链接

实现基于用户角色的链接显示控制

要解决这个问题,我们需要在登录时记录用户角色,然后在View中根据角色动态控制Delete链接的显示。下面一步步来修改你的代码:

1. 完善登录时的角色标识存储

首先,你的ADO类目前用静态变量存储用户名,但静态变量在多用户环境下会被覆盖,非常不安全。我们需要添加一个标识来记录当前用户是否是管理员,并且在登录后把这个信息存入Session(Session是每个用户独立的,不会互相干扰)。

修改ADO类代码

// 添加静态属性标记是否为管理员
public static bool IsAdmin { get; set; }

public static void Logindata(MyModel objmymodel) {
    SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=c:\users\nisarg parekh\documents\visual studio 2013\Projects\WebApplication5\WebApplication5\App_Data\Database1.mdf;Integrated Security=True;MultipleActiveResultSets=True;Application Name=EntityFramework");
    con.Open();
    try {
        if(objmymodel.Username=="admin" && objmymodel.Password=="admin") {
            usernamestring = "admin";
            message = "welcome " + objmymodel.Username;
            IsAdmin = true; // 标记为管理员
        } else {
            // 注意:这里一定要用参数化查询,避免SQL注入!
            string check = "select Username,Password from tb1 where Username=@Username and Password=@Password";
            SqlCommand cmd = new SqlCommand(check, con);
            cmd.Parameters.AddWithValue("@Username", objmymodel.Username);
            cmd.Parameters.AddWithValue("@Password", objmymodel.Password);
            
            SqlDataReader dr = cmd.ExecuteReader();
            if (dr.Read()) {
                usernamestring = objmymodel.Username;
                message ="welcome "+ objmymodel.Username;
                IsAdmin = false; // 普通用户
            } else {
                message = "FAIL";
                IsAdmin = false;
            }
        }
    } finally {
        con.Close(); // 确保连接关闭,避免资源泄漏
    }
}

2. 在Controller中存储角色到Session

登录成功后,把管理员标识存入Session,这样View就能访问到用户的角色信息:

public ActionResult Login() {
    return View();
}

[HttpPost]
public ActionResult Login(MyModel objmymodel) {
    ado.Logindata(objmymodel);
    if (ado.message == "FAIL") {
        objmymodel.Username = "";
        objmymodel.Password = "";
        TempData["Message"] = ado.message;
        return RedirectToAction("Login");
    } else {
        // 存储管理员标识到Session
        Session["IsAdmin"] = ado.IsAdmin;
        TempData["Message"] = $"welcome {ado.usernamestring}";
        return RedirectToAction("Show");
    }
}

另外,建议给Show方法加登录校验,防止未登录用户直接访问:

public ActionResult Show() {
    // 检查是否已登录
    if(Session["IsAdmin"] == null) {
        return RedirectToAction("Login");
    }
    // 这里补充你的数据获取逻辑,比如从数据库读取MyModel列表
    List<MyModel> data = // 你的数据查询代码
    return View(data);
}

3. 在View中动态控制链接显示

最后,在View里判断Session中的IsAdmin值,只有管理员才显示Delete链接:

@model List<WebApplication5.Models.MyModel> 
@{ Layout = null; } 
<!DOCTYPE html> 
<html> 
<head> 
    <meta name="viewport" content="width=device-width" /> 
    <title>Show</title> 
</head> 
<body style="background-color:aliceblue"> 
    <div> 
        @TempData["Message"] 
        <b><center>Data Of Table</center></b> 
        <table style="background-color:azure" border="1" align="center" title="DATA OF EMPLOYEE"> 
            @foreach (var objmymodel in Model) { 
            <tr> 
                <td>@objmymodel.Username</td> 
                <td>@objmymodel.Password</td> 
                <!-- 所有用户都显示Update链接 -->
                <td>@Html.ActionLink("update", "Update", new { id = @objmymodel.Id })</td>
                <!-- 仅管理员显示Delete链接 -->
                @if ((bool)Session["IsAdmin"])
                {
                    <td>@Html.ActionLink("delete", "Delete", new {id=@objmymodel.Id })</td>
                }
            </tr> 
            } 
        </table> 
    </div> 
    <div>@Html.ActionLink("Logout","Login","Mycontroller")</div> 
</body> 
</html>

额外优化建议

  • 替换静态变量:你的ADO类用了静态变量usernamestring和message,在多用户场景下会导致数据混乱,建议改成返回一个包含用户名、消息、角色的自定义对象,而不是依赖静态变量。
  • 密码加密:目前代码明文存储和校验密码,非常不安全,建议用MD5、SHA256等哈希算法加盐加密后存储和校验。
  • Session过期处理:可以在Web.config中配置Session的过期时间,避免用户长时间未操作仍保持登录状态。

内容的提问来源于stack exchange,提问作者nisarg parekh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:22:57