Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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# MVC登录错误-还记得我吗?字段是必需的_C#_Asp.net Mvc_Visual Studio 2012 - Fatal编程技术网

C# MVC登录错误-还记得我吗?字段是必需的

C# MVC登录错误-还记得我吗?字段是必需的,c#,asp.net-mvc,visual-studio-2012,C#,Asp.net Mvc,Visual Studio 2012,我有一个具有默认登录功能的MVC应用程序,当我不选中记住我而登录时,复选框model state会添加一个错误,说明: “记住我”字段是必填项。”带有RememberMe键,在模型类中未标记为必填项。对我来说,记住我是可选的 因此,当我在验证用户之前检查if(ModelState.IsValid)时,由于RememberMe错误,IsValid属性为false 因此,目前我正在使用ModelState[“RememberMe”]删除此错误,然后选中ModelState.IsValid 是否有更好

我有一个具有默认登录功能的MVC应用程序,当我不选中
记住我
而登录时,复选框model state会添加一个错误,说明:
“记住我”字段是必填项。”
带有
RememberMe
键,在模型类中未标记为必填项。对我来说,记住我是可选的

因此,当我在验证用户之前检查
if(ModelState.IsValid)
时,由于RememberMe错误,IsValid属性为false

因此,目前我正在使用
ModelState[“RememberMe”]删除此错误,然后选中
ModelState.IsValid

是否有更好的方法避免将此错误添加到
ModelState

我正在使用VS 2012 RC

控制器

[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()
}
@{Layout=“~/Views/Shared/_lightLayout.cshtml”}
@模型MvcFoodService.Models.LoginModel
登录

请输入您的用户名和密码@ActionLink(“注册”、“注册”)
如果你没有账户

@使用(Html.BeginForm()){ @Html.DevExpress().Label(设置=>{ settings.Name=“usernamelab”; settings.Text=“用户名”; settings.AssociatedControlName=“UserName”; }).GetHtml() @EditorFor(m=>m.UserName) @Html.ValidationMessageFor(m=>m.UserName) @Html.DevExpress().Label(设置=>{ settings.Name=“PasswordLabel”; settings.Text=“Password”; settings.AssociatedControlName=“密码”; }).GetHtml() @EditorFor(m=>m.Password) @Html.ValidationMessageFor(m=>m.Password) @Html.DevExpress()复选框(设置=>{ settings.Name=“RememberMe”; settings.Text=“还记得我吗?”; }).GetHtml() @Html.DevExpress()按钮(设置=>{ settings.Name=“Button”; settings.Text=“登录”; settings.UseSubmitBehavior=true; }).GetHtml() }
记住
字段是一个复选框。这意味着,如果未选中,则不会在post中提供

因此,如果你在行动中有这样的经历:

[HttpPost]
public ActionResult Login(string userName, string password, bool rememberMe)
{
}
[HttpPost]
public ActionResult Login(string userName, string password, bool rememberMe = false)
{
}
它将失败,因为没有提供值

您可以通过修改操作来解决此问题:

[HttpPost]
public ActionResult Login(string userName, string password, bool rememberMe)
{
}
[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" />
你们都准备好了

旁注

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构建的),memberme字段是一个DevExpress可为空的复选框。 必须设置默认值

@Html.DevExpress().CheckBox(settings => {
        settings.Name = "RememberMe";
        settings.Text = "Remember me?";
        settings.Checked = false;
    }).GetHtml()
尝试一个可为空的bool


公共场所?请记住{get;set;}

您能否
编辑您的问题
并添加您的模型类定义。并包含视图的相关部分。我猜您是在传回NULL而不是true/false。请记住,您的视图中可能缺少某些内容?您是否只传回
false
?复选框是可选的对我来说没有多大意义,它要么是选中的,要么不是。第二种解决方案感觉是错误的,即使它有效。这就是HTTP表单值的工作原理吗?我的意思是可选的,用户可以检查它,也可以不检查它,因此如果他不检查它,ModelState.IsValid将变为false,正如我前面提到的,谢谢你的回复bt,我想在给你所有代码后,你们都会更好地理解我的问题,任何帮助都很重要appreciated@NirushanFerdinandChandran:我的答案(两种解决方案)解决了未经检查的记忆问题。感谢jgauffin bt我使用LoginModel in Action方法n视图与您提到的不同,您能帮我吗?嗨jgauffin,感谢agn bt更新2似乎不起作用,如果你能给我一个解决方案,我将不胜感激。提前谢谢