我有一个具有默认登录功能的 MVC 应用程序,当我登录时没有选中 Remember me
复选框模型状态添加了一条错误消息:
“The Remember me? field is required.”
带有 RememberMe
键,它在模型类中未标记为必需。对我来说,记住我是可选的。
因此,当我在验证用户之前检查 if(ModelState.IsValid)
时,由于 RememberMe 错误,IsValid 属性为 false。
因此,目前我正在使用登录操作方法中的 ModelState["RememberMe"].Errors.Clear();
消除此错误,并检查 ModelState.IsValid
。
是否有更好的方法来避免将此错误添加到 ModelState
中?
我正在使用 VS 2012 RC
Controller
[HttpPost]
public ActionResult Login(LoginModel model, string returnUrl) {
ModelState["RememberMe"].Errors.Clear();
if(ModelState.IsValid) {
if(Membership.ValidateUser(model.UserName, model.Password)) {
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
if(Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
&& !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\")) {
return Redirect(returnUrl);
}
else {
return RedirectToAction("Index", "Home");
}
}
else {
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
型号
public class LoginModel
{
[Required]
[Display(Name = "User name")]
public string UserName { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
查看
@{ Layout = "~/Views/Shared/_lightLayout.cshtml"; }
@model MvcFoodService.Models.LoginModel
<div class="accountHeader">
<h2>
Log In</h2>
<p>
Please enter your username and password. @Html.ActionLink("Register", "Register")
if you don't have an account.</p>
</div>
@using(Html.BeginForm()) {
@Html.DevExpress().Label(settings => {
settings.Name = "UserNameLabel";
settings.Text = "User Name";
settings.AssociatedControlName = "UserName";
}).GetHtml()
<div class="form-field">
@Html.EditorFor(m => m.UserName)
@Html.ValidationMessageFor(m => m.UserName)
</div>
@Html.DevExpress().Label(settings => {
settings.Name = "PasswordLabel";
settings.Text = "Password";
settings.AssociatedControlName = "Password";
}).GetHtml()
<div class="form-field">
@Html.EditorFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password)
</div>
<div class="form-field">
@Html.DevExpress().CheckBox(settings => {
settings.Name = "RememberMe";
settings.Text = "Remember me?";
}).GetHtml()
</div>
@Html.DevExpress().Button(settings => {
settings.Name = "Button";
settings.Text = "Log On";
settings.UseSubmitBehavior = true;
}).GetHtml()
}
最佳答案
RememberMe
字段是一个复选框。这意味着如果未选中,则不会在帖子中提供。
因此,如果您在操作中遇到这样的情况:
[HttpPost]
public ActionResult Login(string userName, string password, bool rememberMe)
{
}
它将失败,因为没有提供任何值。
可以通过修改action来解决:
[HttpPost]
public ActionResult Login(string userName, string password, bool rememberMe = false)
{
}
这告诉 MVC 它是可选的。
也可以通过在表单中包含一个隐藏的输入来解决:
<input type="hidden" name="rememberme" value="false" />
<input type="checkbox" name="rememberme" value="true" />
如果选中(将使用最后一个值)或如果未选中则仅发送隐藏值(false)。
更新
由于您使用的是 View 模型,因此您必须将 RememberMe
字段设置为 bool?
或进行更改,以便在复选框输入上方有一个隐藏的输入。
更新2:
只需在 View 中更改为:
<div class="form-field">
@Html.DevExpress().CheckBox(settings => {
settings.Name = "RememberMe";
settings.Text = "Remember me?";
}).GetHtml()
<input type="hidden" name="RemberMe" value="false" />
</div>
一切就绪。
旁注
ASP.NET MVC3:s action helper 生成的代码如下所示:
<input data-val="true" data-val-required="The Remember me? field is required." id="RememberMe" name="RememberMe" type="checkbox" value="true" />
<input name="RememberMe" type="hidden" value="false" />
因此 DevExpress 不遵循 MVC3 的行为(因为它是为 ASP.NET MVC 构建的,所以它应该遵循)
关于c# - MVC 登录错误 - 还记得我吗?字段是必需的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12256997/