如何在jQuery中获取mvc c#用户角色

本文关键字:mvc 用户 角色 获取 jQuery | 更新日期: 2023-09-27 18:00:53

我在jQuery中有一个函数可以禁用基于用户角色的输入。但我不知道如何在jQuery中获得当前ASP.Net MVC用户角色。

以下是代码,但它不起作用:

$(function () {
        if (Roles.IsUserInRole('user'))
        {
            $("#GenericName").prop("disabled", true);
            $("#TradeName").prop("disabled", true);
            $("#Form").prop("disabled", true);
            $("#Strength").prop("disabled", true);
            $("#IsBrandSubstitutionAllowed").prop("disabled", true);
            $("#Route").prop("disabled", true);
            $("#Dosages").prop("disabled", true);
            $("#Unit").prop("disabled", true);     
            $("#PackTypes").prop("disabled", true);  
            $("#GeneratedDirection").prop("disabled", true);  
            $("#UserDirection").prop("disabled", true);  
            $("#StartDate").prop("disabled", true);  
            $("#EndDate").prop("disabled", true); 
        }
    });

如何在jQuery中获取mvc c#用户角色

问题:您正在混合Javascript和Razor视图。

您所拥有的:

if (Roles.IsUserInRole('user')) 
{

实际上应该写成

var userRole = '@(Roles.IsUserInRole("user") ? "true" : "false")';
if(userRole) {
   ...

此代码@(Roles.IsUserInRole('user') ? "true" : "false")将输出truefalse文本字符串(因为它没有用单引号或双引号包装,javascript将解释为布尔值(,您可以只使用新的赋值变量。


我通常所做的是,在我的_Layout.cshtml视图中,我添加了一个简单的全局Javascript,我可以通过我的应用程序轻松调用它。。。例如,假设该视图上有一个CurrentUser对象(通过ViewData或Model(:

<html>
  <head>
    <title>Your App</title>
    <styles ... >
    <script>
       var AppGlobal = {
           "user" = {
               "name" : "@(CurrentUser.Name)",
               "id"   : "@(CurrentUser.Guid.ToString())",
               "role" : "@(CurrentUser.Role.Name)"
           },
           ...
       };
    </script>
  </head>
  <body>
     @RenderBody()
  </body>
</html>

然后就更容易了,在你的情况下:

if(AppGlobal.user.role === 'user') {
...

我建议进行AJAX调用以获得用户角色。

ajax调用后,根据收到的响应,禁用/启用输入。

类似:

$.ajax({
  url: 'Controller1/Action1',
  dataType: 'json',
  data: {},
  type: 'post',
  success: function(data){
    if(data.user === 'user') {
       // disable inputs here !
    }
  }
});

和你的控制器Controller1Controller:

[HttpPost]
public JsonResult Action1(){
   return Json(new {
      user =  // put current user role here !
   });
}

此外,我建议使用ValidateAntiForgeryToken来避免CSRF攻击,但由于没有表单,因此似乎可以。

var userRole = '@(User.IsInRole("user") ? "true" : "false")';
if(userRole) {
   ...

在我的情况下,我不得不使用if条件,比如这个

If(userRole=="true"){
    ...
} 

然后代码达到了跳过它的条件。

如果您在Razor视图中编写JavaScript代码,则只能使用C#代码,如Roles.IsUserInRole('user'(。

作为一种变通方法,您可以创建一个操作来告诉您用户的权限或角色,每次需要权限时,您都需要向其发送请求。您还可以保留返回状态的副本以保存后续请求。根据您的项目,您可以更复杂地使用它,并使您的授权逻辑分离。

使用MVC 5.2.2,这对我的有效

var userRoleAdmin = '@(Request.IsAuthenticated && User.IsInRole("Admin")) ? "true" : "false")';
if(userRoleAdmin) {
   ...