1

以下是我的用户模型类,

public class User
{
    [System.ComponentModel.DataAnnotations.Key]
    public int UserId { get; set; }
    public Int16 RoleID { get; set; }
    [DisplayName("First Name :")]
    public string FirstName { get; set; }
    [DisplayName("Last Name :")]
    public string LastName { get; set; }

    [DisplayName("Email :")]
    [Required(ErrorMessage = "Email is required")]
    [EmailAddress(ErrorMessage = "Invalid Email Address")]
    public string Email { get; set; }

    [DataType(DataType.Password)]
    [Required(ErrorMessage = "Password is required")]
    [DisplayName("Password :")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Compare("Password")]
    [Required(ErrorMessage = "Confirm password is required")]
    [DisplayName("Confirm Password :")]
    public string CPassword { get; set; }
}

以下代码在 AccountController

 [HttpPost]
 [AllowAnonymous]
 [ValidateAntiForgeryToken]
 public ActionResult Login(User model, string returnUrl)
 {
      if(ModelState.IsValid) //This turns out to be always false
 }

这转到 Login.cshtml

@using (Html.BeginForm())
{
 @Html.AntiForgeryToken()
 @Html.ValidationSummary(true)
 <fieldset class="cf addForm">
     @Html.LabelFor(model => model.Email)
     @Html.TextBoxFor(model => model.Email, new { @class = "wd293 inputtext" })
     @Html.ValidationMessageFor(model => model.Email)
     @Html.LabelFor(model => model.Password)
     @Html.PasswordFor(model => model.Password, new { @class = "wd293 inputtext" })
     @Html.ValidationMessageFor(model => model.Password)
     <div class="cf signBtn">
        <input type="submit" value="Sign in" class="pageBtn alignleft savebtn" />
     </div>
 </fieldset>
 }

上面的模型类应该适用于注册表单,即需要所有详细信息的地方,例如电子邮件/密码/确认密码

但是对于只需要电子邮件和密码字段的登录表单,因此在这种情况下 ModelState.IsValid 总是给出错误的。

我处于两难境地,应该是什么解决方案,创建另一个模型类?就像登录表单一样,会有另一个模型 UserLoginViewModel 它只有 2 个属性电子邮件/密码,而注册表单 UserRegisterViewModel 将具有所有必需的属性?

请耐心等待,如果这听起来很愚蠢,因为我对 MVC4 还很陌生。如果还需要更多代码,请告诉我。

编辑

public class MyDBContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Category> Categories { get; set; } // It has CategoryID,CategoryName properties
}

以上是我的数据库上下文类,为了在数据库中保存类别,我编写了以下代码,

 new MyDBContext().Categories.Add(category);

因此,假设我创建了UserRegisterViewModel具有注册表所需的所有属性的新类,在这种情况下,我需要再次将此 UserRegisterViewModel 转换为 User,这样可以吗?还是会增加内存开销?

转换就像

 User newUser = new User(); //Assign all the properties from UserRegisterViewModel to this and save 
 new MyDBContext().Users.Add(newUser);

请帮忙。

4

3 回答 3

2

在这种情况下,每个视图应该有一个类。如果您在 Visual Studio 中从 Internet 模板创建 MVC 项目,则默认生成此类/模型。如果你愿意,你可以使用继承。但是,有一些可能性可以避免使用多个模型,但我认为每个视图都有一个模型更清洁、更快捷。

于 2013-11-09T07:18:28.323 回答
0

事实证明,我们还可以验证特定属性并使用以下代码检查 ModelState,

//Instead of this - which checks all attributes of model class
if (ModelState.IsValid)

改成这个

//This will only verify against email/password property only so other property are ignored
if (ModelState.IsValidField("Email") && ModelState.IsValidField("Password")) 

用上面的代码更改登录代码,它就起作用了。

谢谢大家的支持。

于 2013-11-09T17:08:54.540 回答
0

尝试从电子邮件地址中删除必填字段属性

 [EmailAddress(ErrorMessage = "Invalid Email Address")]

试试这个,它会工作还是不行?你的模型现在有效吗?

于 2013-11-09T08:50:25.930 回答