ASP.NET MVC在表单上,​​如何获取视图中复选框的检查状态?

时间:2016-08-24 19:58:34

标签: asp.net asp.net-mvc razor checkbox asp.net-identity

在我使用Identity框架的系统中,我在一个绑定到模型AppUser的视图中有以下表单:

<div class="form-group">
    <label>Name</label>
    <p class="form-control-static">@Model.Id</p>
</div>
@using (Html.BeginForm("Edit", "Admin", new { returnUrl = Request.Url.AbsoluteUri }, FormMethod.Post, new { @id = "edituserform" }))
{

    @Html.HiddenFor(x => x.Id)
    <div class="form-group">
        <label>Email</label>
        @Html.TextBoxFor(x => x.Email, new { @class = "form-control" })
    </div>
    <div class="form-group">
        <label>Password</label>
        <input name="password" type="password" class="form-control" />
    </div>

 <input type="checkbox" name="userLockout" value="Account Locked" @(Html.Raw(Model.LockedOut ? "checked=\"checked\"" : "")) /> @:Account Locked <br>

<button type="submit" class="btn btn-primary">Save</button>
    <button class="btn btn-default"
            id="canceleditbutton">
        Cancel
    </button>
}

AppUser的模型定义:

public class AppUser : IdentityUser
{
   public bool LockedOut { get; set; }

   /*Other fields not shown for brevity*/

}

我的具体问题是关于LockedOut标志的复选框,这是我添加的自定义属性。对于测试用户,我手动将数据库中的标志设置为True,并且正如预期的那样,在视图上加载时选中了复选框。现在我的目标是能够在此表单调用提交的AdminController的POST编辑方法中访问它。该方法的骨架如下:

[HttpPost]
public async Task<ActionResult> Edit(string id, string email, string password, string userLockout)
{
 //Code here to change the LockedOut value in the database based on the input received
}

问题是当我在编辑屏幕上的提交上单击“保存”时,userLockout参数将显示为null。其他两个值正确填充。如何访问userLockout值,以便在需要时可以继续将更改保存到数据库中?

最后,我的最终目标是实现一个系统,管理员可以通过LockedOut标志锁定或解锁用户帐户(每次有人登录时都会检查)。我知道Identity框架支持锁定,但这似乎只是限时锁定。 Identity框架中是否存在永久(除非手动更改)锁定的方式?我试图尽可能少地使用自定义代码和设计,这就是为什么我也有兴趣知道这一点。特别是,我有兴趣使用框架跟踪不成功的登录尝试计数的方式,因为我想尽量避免手动实现。

谢谢。

1 个答案:

答案 0 :(得分:1)

在Edit方法中将userLockout类型更改为bool,帖子应该可以正常工作。

要在n次失败尝试后锁定用户很长时间(永久锁定的子项),一个选项是将DefaultLockoutTimeSpan设置为将来x年。

要检查用户是否已被锁定,请尝试UserManager.IsLockedOutAsync(userId)