我想要改变用户角色,一旦他们自动完成一些工作,但正常的db.savechanges()不工作,他们甚至没有抛出任何错误,一些能解决这个问题吗?
控制器中用于更改数据库中用户角色的代码为:
[AllowAnonymous]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login(PRSV_Login loginData, string ReturnUrl = "")
{
string message = "";
using (PRSVEntities db = new PRSVEntities())
{
var dataItem = db.PRSV_Login.Where(x => x.Email == loginData.Email).FirstOrDefault();
if (dataItem != null)
{
if(string.Compare(Encrypto.Hash(loginData.Password), dataItem.Password) == 0)
{
int timeout = 20;
var ticket = new FormsAuthenticationTicket(loginData.Email, true, timeout);// pass one more variable admin
string encrypted = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted);
cookie.Expires = DateTime.Now.AddMinutes(timeout);
cookie.HttpOnly = true;
Response.Cookies.Add(cookie);
if (Url.IsLocalUrl(ReturnUrl))
{
return Redirect(ReturnUrl);
}
else
{
if (dataItem.Role == "Admin")
{
return RedirectToAction("AdminPanel", "Home");
}
if (dataItem.Role == "Voter")
{
var isEmail = IsEmailExist(loginData.Email);
if (isEmail)
{
loginData.Role = "Voted";
db.SaveChanges();
Session["username"] = dataItem.Name;
Session["Email"] = dataItem.Email;
ModelState.AddModelError("EmailExist", "Candidate has Already Voted!");
Session["message"] = "<h1 class=\"display-5 fw-bold sorry\">sorry!</h1><br><p class=\"col-md-8 fs-4\"><b>" +
dataItem.Name + ",</b> <br><br>You can not vote <b>twice or more!</b><br></p>";
return RedirectToAction("Sorry", "Home");
}
else
{
Session["username"] = dataItem.Name;
Session["Email"] = dataItem.Email;
TempData["Name"] = dataItem.Name;
TempData["Email"] = dataItem.Email;
return RedirectToAction("VotePanel", "Home");
}
}
else
{
if (dataItem.Role == "Voted")
{
Session["username"] = dataItem.Name;
Session["Email"] = dataItem.Email;
ModelState.AddModelError("EmailExist", "Candidate has Already Voted!");
Session["message"] = "<h1 class=\"display-5 fw-bold sorry\">sorry!</h1><br><p class=\"col-md-8 fs-4\"><b>" +
dataItem.Name + ",</b> <br><br>You can not vote <b>twice or more!</b><br></p>";
return RedirectToAction("Sorry", "Home");
}
else
{
message = "Invalid credential provided";
return RedirectToAction("Index", "Home");
}
}
}
}
else
{
ModelState.AddModelError("", "Invalid Email-Id/Password");
return View();
}
}
else
{
ModelState.AddModelError("", "Invalid Email-Id/Password");
return View();
}
}
}我也在使用身份包。我还为这个角色操作使用了一个单独的类,如下所示
namespace DEE_PRSV_V2_3.MyRoleProvider
{
public class SiteRole : RoleProvider
{
public override void AddUsersToRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}
public override string ApplicationName
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public override void CreateRole(string roleName)
{
throw new NotImplementedException();
}
public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
throw new NotImplementedException();
}
public override string[] FindUsersInRole(string roleName, string usernameToMatch)
{
throw new NotImplementedException();
}
public override string[] GetAllRoles()
{
throw new NotImplementedException();
}
public override string[] GetRolesForUser(string Email)
{
PRSVEntities db = new PRSVEntities();
string data = db.PRSV_Login.Where(x => x.Email == Email).FirstOrDefault().Role;
string[] result = { data };
return result;
}
public override string[] GetUsersInRole(string roleName)
{
throw new NotImplementedException();
}
public override bool IsUserInRole(string username, string roleName)
{
throw new NotImplementedException();
}
public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}
public override bool RoleExists(string roleName)
{
throw new NotImplementedException();
}
}
}发布于 2021-09-13 14:07:23
您正在更改方法参数loginData的值,该值未附加到您的上下文。您应该更改从数据库检索到的dataItem的Role。
发布于 2021-09-13 14:28:46
如果您使用的是ASP.NET Identity,则可以将UserManager注入到控制器中。
private readonly UserManager<ApplicationUser> _userManager;
public MyController(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
//Action Method
public async Task<IActionResult> Login(...)
{
// Get current user. You can also use UserManager's
// FindByIdAsync or FindByEmailAsync methods.
var user = await _userManager.GetUserAsync(HttpContext.User);
// Add user to role
var result = await _userManager.AddToRoleAsync(user, "MyRole");
if(result.Succeeded)
{
//Handle result
}
}https://stackoverflow.com/questions/69164037
复制相似问题