Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.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
Javascript Model.Isvalid在我的MVC4应用程序中获取失败。你如何解决这个问题?_Javascript_C#_.net_Asp.net Mvc - Fatal编程技术网

Javascript Model.Isvalid在我的MVC4应用程序中获取失败。你如何解决这个问题?

Javascript Model.Isvalid在我的MVC4应用程序中获取失败。你如何解决这个问题?,javascript,c#,.net,asp.net-mvc,Javascript,C#,.net,Asp.net Mvc,我有一个视图,该视图包含创建用户和登录表单。我有两种不同的型号。当用户单击Register按钮时,我将传递Register模型值,对于log in,单击我传递log in模型值。我也在模型中添加了一些验证(您可以在下面的代码中看到)。 因为我有两个模型,所以我又添加了一个模型(帐户),它保存了这两个模型。我在点击注册或登录时将这个模型(帐户)从视图传递给控制器。 模型始终无效的原因是,当用户单击“登录”按钮时,会传递一个帐户模型,该帐户模型既有“注册”模型又有“登录”模型,但只有“登录详细信息”

我有一个视图,该视图包含创建用户和登录表单。我有两种不同的型号。当用户单击Register按钮时,我将传递Register模型值,对于log in,单击我传递log in模型值。我也在模型中添加了一些验证(您可以在下面的代码中看到)。 因为我有两个模型,所以我又添加了一个模型(帐户),它保存了这两个模型。我在点击注册或登录时将这个模型(帐户)从视图传递给控制器。 模型始终无效的原因是,当用户单击“登录”按钮时,会传递一个帐户模型,该帐户模型既有“注册”模型又有“登录”模型,但只有“登录详细信息”。自用户单击“登录”后,“注册”模型的所有值都将为空(只有登录数据会出现)。所以在控制器模型中,Is valid总是false,因为寄存器模型中并没有值

那么,是否有其他方法来验证特定模型? 在这种情况下,解决方案是什么

 @model Selfie.Models.Account
   @using (Html.BeginForm())     
        { 

                   @Html.TextBoxFor( model => model.RegisterModel.FirstName,null, new {@class="form-control",id="fn", placeholder=" First Name",required="true",maxlength="20"})
                   @Html.ValidationMessageFor(model => model.RegisterModel.FirstName) 

                    @Html.TextBoxFor(model => model.RegisterModel.LastName,null, new { @class = "form-control",id="ln", placeholder=" Last Name",required="true",maxlength="20"})
                    @Html.ValidationMessageFor(model => model.RegisterModel.LastName)

                   <button type="submit" class="btn btn-success" id="btnsub">Create Account</button>        


        } 
//Login
@using (Html.BeginForm("Login", "Selfie", FormMethod.Post, new { }))
        {   


                    @Html.TextBoxFor(model => model.LoginModel.UserName,null, new { @class = "form-control",id="lem"})
                    @Html.ValidationMessageFor(model => model.LoginModel.UserName) 

                     @Html.TextBoxFor(model => model.LoginModel.Pwd,null, new { @class = "form-control"})
                     @Html.ValidationMessageFor(model => model.LoginModel.Pwd) 

                    <button type="submit" class="btn btn-success" id="btnlogin">Log In</button>

        }    
模型


首先,正如Stephen在评论中提到的,这两种形式不应该完全相同

然而,我在过去遇到过同样的问题,即仅验证模型的一部分(在模型和实体实现相同接口的情况下,有时可能无法验证所有内容)

我通过执行以下操作解决了这个问题,您只验证从表单传入的字段。因此,在你的行动中,你会:

var itemsToIgnore = ModelState.Keys
    .Where(c => !Request.Form.AllKeys.Contains(c))
    .ToList();

foreach (var item in itemsToIgnore)
{
    ModelState.Remove(item);
}

if (ModelState.IsValid)
{
    //all fields passed in were valid
}

Register()
Login()
是两种不同的方法(而
Register()
是一种一次性的、永远不会重复的操作)。为什么它们是一种形式?验证组@SamiKuhmonen这恐怕只是网络表单。我有一个包含注册表单和登录的视图。对于两者,我有不同的模型。Register()方法将在单击Register按钮时调用。单击“登录”按钮将调用登录方法。我将注册和登录保持在一个视图中。我现在从您的编辑中看到您正在使用两个表单。除此之外,它需要是
public ActionResult登录([Bind(Prefix=“LoginModel”)]LoginModel模型)
那么你就没有问题了。如果它能工作,我很兴奋。过滤变量
itemsToIgnore
背后的逻辑是什么?@JenishRabadiya基本上我们说的是我们要删除的任何失败的模型状态值,因为我们发布的表单不包含字段。我问的是
包含(c)
过滤器背后的逻辑。它是如何过滤从表单传入的字段的?@JenishRabadiya,这样我们就可以得到模型状态中尚未在表单中提交的项,所以
!Request.Form.AllKeys.Contains(c)
表示处于模型状态但不在表单集合中的任何内容。@mattytomo,这不是必需的。真正的问题是controller POST方法中的操作错误,它需要是
public ActionResult Login([Bind(Prefix=“LoginModel”)]LoginModel model)
,以便只绑定
LoginModel
属性(与
RegisterModel
相同)
   [Required(ErrorMessage="Last name is required")]
    public string LastName {get; set;}
    [Required(ErrorMessage="First name is required")]
    public string FirstName { get; set; }

}

public class LoginModel
{
    [Required(ErrorMessage = "User name is required")]
    [Display(Name = "User name")]
    [RegularExpression("^([\\w\\.\\-]+)@([\\w\\-]+)((\\.(\\w){2,3})+)$", ErrorMessage = "Invalid email")]
    public string UserName { get; set; }

    [Required(ErrorMessage = "Password is required")]
    public string Pwd { get; set; }
}
public class Account
    {
        public LoginModel LoginModel{get; set;}
        public RegistrationModel RegisterModel {get; set;}
    }
var itemsToIgnore = ModelState.Keys
    .Where(c => !Request.Form.AllKeys.Contains(c))
    .ToList();

foreach (var item in itemsToIgnore)
{
    ModelState.Remove(item);
}

if (ModelState.IsValid)
{
    //all fields passed in were valid
}