Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';t使用ASP.NET内核更新SQL位列_C#_Asp.net Core_Asp.net Core Mvc_Entity Framework Core_Asp.net Core 2.2 - Fatal编程技术网

C# Can';t使用ASP.NET内核更新SQL位列

C# Can';t使用ASP.NET内核更新SQL位列,c#,asp.net-core,asp.net-core-mvc,entity-framework-core,asp.net-core-2.2,C#,Asp.net Core,Asp.net Core Mvc,Entity Framework Core,Asp.net Core 2.2,我有一个ASP.NET核心web应用程序,当我创建项目时,身份验证是使用“个人用户帐户”选项自动设置的。还自动创建了用户帐户/角色的数据库表 我创建了自己的ApplicationUser类,该类继承自IdentityUser,并为FirstName、LastName和LockoutReason添加了参数。(我也将这些字段添加到了DB表中)现在我尝试添加一个功能,允许用户手动锁定用户,但我似乎无法更新数据库中的LockoutEnabled字段。每次我这样做,它就会自动重置为false 以下是表格的

我有一个ASP.NET核心web应用程序,当我创建项目时,身份验证是使用“个人用户帐户”选项自动设置的。还自动创建了用户帐户/角色的数据库表

我创建了自己的ApplicationUser类,该类继承自IdentityUser,并为FirstName、LastName和LockoutReason添加了参数。(我也将这些字段添加到了DB表中)现在我尝试添加一个功能,允许用户手动锁定用户,但我似乎无法更新数据库中的LockoutEnabled字段。每次我这样做,它就会自动重置为false

以下是表格的图片:

以及它的获取/发布代码:

//GET Users lock
    public async Task<IActionResult> Lock(string id)
    {
        if (id == null)
        {
            return NotFound();
        }

        var userFromDb = await _db.ApplicationUser.SingleOrDefaultAsync(m => m.Id == id);
        if (userFromDb == null)
        {
            return NotFound();
        }
        else
        {
            return View(userFromDb);
        }
    }

    //POST Users lock
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Lock(string Id, ApplicationUser model)
    {
        var userFromDb = await _db.Users.Where(u => u.Id == Id).FirstOrDefaultAsync();

        userFromDb.LockoutEnd = model.LockoutEnd;
        userFromDb.LockoutEnabled = true;
        userFromDb.AccessFailedCount = model.AccessFailedCount;
        userFromDb.LockoutReason = model.LockoutReason;

        _db.ApplicationUser.Update(userFromDb);
        await _db.SaveChangesAsync();

        return RedirectToAction(nameof(Index));           
    }
单击锁定按钮时,LockoutEnd和LockoutReason字段将正确更新,但LockoutEnabled字段仍为false,并且帐户未锁定

尝试实施解决方案后的新POST方法:

//POST Users lock
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Lock(string Id, ApplicationUser model)
    {
        var userFromDb = await _db.Users.Where(u => u.Id == Id).FirstOrDefaultAsync();

        userFromDb.LockoutEnd = model.LockoutEnd;            
        userFromDb.AccessFailedCount = model.AccessFailedCount;
        userFromDb.LockoutReason = model.LockoutReason;

        _db.ApplicationUser.Update(userFromDb);            
        await _db.SaveChangesAsync();

        var user2 = await _userManager.FindByIdAsync(userFromDb.Id);
        var result = await _userManager.SetLockoutEnabledAsync(user2, true);

        return RedirectToAction(nameof(Index));           
    }
//POST用户锁
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务锁(字符串Id,ApplicationUser模型)
{
var userFromDb=await _db.Users.Where(u=>u.Id==Id).FirstOrDefaultAsync();
userFromDb.LockoutEnd=model.LockoutEnd;
userFromDb.AccessFailedCount=model.AccessFailedCount;
userFromDb.LockoutReason=model.LockoutReason;
_db.ApplicationUser.Update(userFromDb);
等待_db.SaveChangesAsync();
var user2=await\u userManager.FindByIdAsync(userFromDb.Id);
var result=await_userManager.SetLockoutEnabledAsync(user2,true);
返回重定向到操作(名称(索引));
}

您无法通过更改
LockoutEnabled
属性来实现这一点

相反,您需要添加自定义属性,例如
IsEnabled

  • 关于注册操作修改应用程序用户

    var user=newapplicationuser{UserName=model.Email,Email=model.Email,IsEnabled=true}

  • 在PasswordSigninAsync上添加IsEnabled检查

"

if(user.IsEnabled)
return base.PasswordSignInAsync(用户名、密码、记忆、shouldLockout);
返回Task.FromResult(SignInStatus.LockedOut);
UserManager\u UserManager

\u userManager=userManager//通过CTOR为该类分配数据

从用户表直接访问表是永远不会完成的

在您的情况下,您可能需要通过调用
var user=wait\u userManager.FindByIdAsync(model.Id)

因为您可能没有足够的关于模型变量中后期填充的传递的信息

//used from with in method
//model.LockoutEnabled will be either true or false depending on your selection
//from the view.
var result = await _userManager.SetLockoutEnabledAsync(user, model.LockoutEnabled); 

这将返回
IdentityResult
,其中包含错误集合或bool successed属性,可以根据需要进行处理。

您需要将这两个属性组合起来,即
LockoutEnabled
LockoutEnd


LockoutEnabled
是一个指示器,用于查看用户是否可以被锁定,而
LockoutEnd
是一个日期时间偏移量。因此,为了锁定用户,请将锁定设置为true,并在将来输入值
LockoutEnd
,因为过去的值表示用户未被锁定。

尝试更新然后保存,参考()我只是试了一下,但它对我不起作用编辑:谢谢你的帮助,虽然不知道为什么,也许其他人可以帮助。你看过应用程序发送给db的查询了吗?字段是否包含在select和update语句中?这是一条评论中建议的,它对我不起作用。位字段(LockoutEnabled)是唯一一个不会更新的字段。感谢您的帮助-原来我只是误解了锁定的工作原理,但最终我可能会接受您的建议,创建自己的SignInManager和自定义锁定功能。您已经查看了@Hameed的帖子作为答案。它起作用了吗?将结果设置为该值是否会锁定用户,或者我是否需要对该变量执行某些操作?我试着调用wait_userManager.SetLockoutEnabledAsync(user,true),但没有成功。我还将user设置为wait_userManager.FindByIdAsync(userFromDb.Id),这样我就不需要更新LockoutEnabled了,我只是误解了帐户锁定的工作原理。不过我很感谢你的帮助!您是否将Startup.cs中的项目设置为Identity<代码>服务.Configure(配置=>{})IsDisabled,然后创建您自己的
SignInManager
,它继承自SignInManager,您可以在其中覆盖
PasswordSignInAsync
,以检查用户是否禁用。
if (user.IsEnabled)
     return base.PasswordSignInAsync(userName, password, rememberMe, shouldLockout);

return Task.FromResult<SignInStatus>(SignInStatus.LockedOut);
//used from with in method
//model.LockoutEnabled will be either true or false depending on your selection
//from the view.
var result = await _userManager.SetLockoutEnabledAsync(user, model.LockoutEnabled);