【问题标题】:Model.Isvalid getting failed in my MVC 4 application. How do fix this?Model.Isvalid 在我的 MVC 4 应用程序中失败。如何解决这个问题?
【发布时间】:2015-04-14 11:23:58
【问题描述】:

我有一个视图,该视图包含创建用户和登录表单。对于两者,我有不同的模型。当用户单击“注册”按钮时,我将传递注册模型值并单击登录,我将传递模型值。我还在模型中添加了一些验证(您可以在下面看到我的代码)。 因为我有两个模型,所以我又添加了一个模型(帐户),它同时保存了这个模型。单击注册或登录时,我将这个模型(帐户)从视图传递到控制器。 模型一直无效的原因是,当用户单击登录按钮时,正在传递具有注册和登录模型但只有登录详细信息的帐户模型。注册模型的所有值都将为空,因为用户单击登录(那里只有登录数据)。所以在控制器中 Model.Is valid 总是假的,因为寄存器模型没有值。

那么还有其他方法可以验证特定模型吗? 这种情况下的解决办法是什么?

 @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>

        }    

//控制器

[HttpPost]

    public ActionResult Register(Account registration)
    {
        if(Model.Isvalid)
          {
              string a= Account.fname; 

            }
    }

    [HttpPost]
    public ActionResult Login(Accountlogin)
    {

        if(Model.Isvalid)
          {
              string a= Account.username; 

            }
    }

型号

   [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;}
    }

【问题讨论】:

  • Register()Login() 是两种不同的方法(而Register() 是一次性的,永远不会重复的操作)。为什么它们是一种形式?
  • @SamiKuhmonen 恐怕这只是网络表单。
  • 我的一个视图包含注册表和登录。对于这两个我有不同的模型。 Register() 方法将在注册按钮的点击时被调用。登录方法将被称为登录按钮的单击。我将注册和登录都保留在一个视图中。
  • 我现在从您的编辑中看到您正在使用 2 个表单。除了它必须是public ActionResult Login([Bind(Prefix="LoginModel")]LoginModel model) 之外,您没有任何问题。

标签: javascript c# .net asp.net-mvc


【解决方案1】:

首先,正如 Stephen 在 cmets 中提到的那样,这两者不应该真正存在于同一个表单上。

但是,我过去在仅验证模型的一部分时遇到过同样的问题(在您的模型和实体实现相同接口的情况下,有时可能不切实际验证一切)。

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

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
}

【讨论】:

  • 如果它起作用我很兴奋过滤变量itemsToIgnore背后的逻辑是什么?
  • @JenishRabadiya 基本上我们说的是我们要删除的任何失败的模型状态值,因为我们发布的表单不包含这些字段。
  • 我在询问 .Contains(c) 过滤器背后的逻辑。它如何过滤从表单传入的字段?
  • @JenishRabadiya 所以我们得到了模型状态下尚未提交到表单中的项目,所以!Request.Form.AllKeys.Contains(c) 表示模型状态下不在表单集合中的任何东西。
  • @mattytommo,这不是必需的。真正的问题是控制器 POST 方法中的 OP 错误,它需要是 public ActionResult Login([Bind(Prefix="LoginModel")]LoginModel model) 以便只绑定 LoginModel 属性(RegisterModel 同上)
猜你喜欢
  • 2021-07-02
  • 2010-10-04
  • 2020-06-27
  • 1970-01-01
  • 2022-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
相关资源
最近更新 更多