【发布时间】:2017-02-10 18:29:50
【问题描述】:
我正在尝试为登录用户设置角色,但我无法在从另一个控制器调用的非操作方法中获取登录用户名。我遗漏了一些东西,因为我收到错误:“对象引用未设置为对象的实例”,我理解这是因为登录的用户名在我的 RegisterAsUser() 方法中为空。 我可以调用非操作方法吗?告诉我我做错了什么。提前谢谢!
我的代码:
非动作方法:
[NonAction]
[Authorize]
public void RegisterAsUser()
{
//Add User role
var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
string role = "User";
//Create Role User if it does not exist
if (!roleManager.RoleExists(role))
{
var roleResult = roleManager.Create(new IdentityRole(role));
}
var store = new UserStore<ApplicationUser>(new ApplicationDbContext());
var userManager = new UserManager<ApplicationUser>(store);
string userId = User.Identity.GetUserId();
if (!Roles.IsUserInRole("Admin"))
{
var result = userManager.AddToRole(userId, role);
}
}
我在其他控制器中调用 RegisterAsUser() 方法的地方:
public ActionResult Create()
{
//set the logged user role to "User"
IdentityRoleController roleController = new IdentityRoleController();
roleController.RegisterAsUser();
... some other code here...
return View();
}
更新:我注意到,如果我用 ActionResult 更改非操作方法并从 url 调用它,它会将角色分配给登录的用户。所以我认为在另一个控制器中用它的非动作方法实例化一个控制器是错误的,但我想知道为什么。
【问题讨论】:
-
在另一个控制器中实例化一个控制器是邪恶的。不要这样。在您的 Web 项目中创建两个控制器都可以使用的服务方法。
-
好的,谢谢我会做的
-
@Gert Arnold 可以多解释一下,请问服务方法是什么意思?我用谷歌搜索它,它返回了一些关于网络服务方法的信息。是你的意思?
-
@DanRomulus 他的意思是使用服务接口设计方法。 blogs.msdn.microsoft.com/simonince/2008/08/25/…
-
我觉得对于我这样的学校项目来说太过分了......
标签: asp.net-mvc entity-framework