Javascript Model.Isvalid在我的MVC4应用程序中获取失败。你如何解决这个问题?
我有一个视图,该视图包含创建用户和登录表单。我有两种不同的型号。当用户单击Register按钮时,我将传递Register模型值,对于log in,单击我传递log in模型值。我也在模型中添加了一些验证(您可以在下面的代码中看到)。 因为我有两个模型,所以我又添加了一个模型(帐户),它保存了这两个模型。我在点击注册或登录时将这个模型(帐户)从视图传递给控制器。 模型始终无效的原因是,当用户单击“登录”按钮时,会传递一个帐户模型,该帐户模型既有“注册”模型又有“登录”模型,但只有“登录详细信息”。自用户单击“登录”后,“注册”模型的所有值都将为空(只有登录数据会出现)。所以在控制器模型中,Is valid总是false,因为寄存器模型中并没有值 那么,是否有其他方法来验证特定模型? 在这种情况下,解决方案是什么Javascript Model.Isvalid在我的MVC4应用程序中获取失败。你如何解决这个问题?,javascript,c#,.net,asp.net-mvc,Javascript,C#,.net,Asp.net Mvc,我有一个视图,该视图包含创建用户和登录表单。我有两种不同的型号。当用户单击Register按钮时,我将传递Register模型值,对于log in,单击我传递log in模型值。我也在模型中添加了一些验证(您可以在下面的代码中看到)。 因为我有两个模型,所以我又添加了一个模型(帐户),它保存了这两个模型。我在点击注册或登录时将这个模型(帐户)从视图传递给控制器。 模型始终无效的原因是,当用户单击“登录”按钮时,会传递一个帐户模型,该帐户模型既有“注册”模型又有“登录”模型,但只有“登录详细信息”
@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
}