我正在尝试将角色设置为已记录的用户,但我无法在从另一个控制器调用的非操作方法中获取已记录的用户名。我遗漏了一些东西,因为我得到了错误:"对象引用没有设置为对象的实例",我理解,因为在RegisterAsUser()方法中记录的用户名为null。 我可以将非动作方法调用好吗?告诉我我做错了什么。提前谢谢!
我的代码:
非行动方法:
[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调用它,则会将角色分配给已记录的用户。所以我假设在另一个控制器中使用它的非动作方法实例化控制器是错误的,但我想知道原因。
答案 0 :(得分:1)
还有其他方法解决此问题:
将userId从Create(父操作)传递给RegisterAsUser(子操作),将子操作传递为AllowAnonymos(过滤器)。
使用服务层而不是子操作(这在OOP中很重要)。
答案 1 :(得分:0)
我面临的问题是,在其他控制器B中实例化控制器A,是因为我没有从控制器A获取controllerContext到它在控制器B中的实例和其他功能。为了克服这一点,我使用了这个:
var controller = DependencyResolver.Current.GetService<ControllerB>();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext, controller);
...来自这篇文章:How to call another controller Action From a controller in Mvc [第二个解决方案]
更新:我找到了更好的解决方案:
HttpContext.Current.User.Identity.Name
获取当前用户
与
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
var roleService = new IdentityRoleService();
roleService.RegisterAsUser();
将“用户”角色分配给已登录用户
谢谢大家!