【问题标题】:mvc4 declaring model class - dilemmamvc4 声明模型类 - 困境
【发布时间】:2013-11-09 05:38:05
【问题描述】:

以下是我的用户模型类,

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 始终为 false。

我在两难中应该是什么解决方案,创建另一个模型类?就像登录表单一样,会有另一个模型 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);

请帮忙。

【问题讨论】:

  • 启动一个新的 MVC Internet 项目 - 它包括用于帐户管理的模型/视图/控制器代码。看看 MS 是如何做到的。
  • 我检查了实现,但他们使用了内置的身份验证机制,可能有内部数据库,在我的情况下,我已经在数据库中配置了用户表。请检查更新的问题。
  • 如果您使用不同的视图模型,那么是的,需要在两者中都有转换方法(我有时将其作为 Save(User u) 放入模型中)。作为一个选项,您可以尝试 AutoMapper(内存开销也是如此,但 invisibe :)。如果您派生模型,则可以使用 Save() 方法覆盖。
  • @jim 您能否为此提供任何链接或演示,因为我是这一切的新手,或者您也可以给出答案。谢谢
  • @AniShroff 我的意思是,您可以在视图模型的方法中执行它,而不是在控制器中分配用户属性,例如 Save()(它应该将模型的属性保存到用户实体中)。

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


【解决方案1】:

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

【讨论】:

  • 我已根据您的建议更新了我的问题,请协助。
【解决方案2】:

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

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

试试这个,行不行?你的模型现在有效吗?

【讨论】:

  • 电子邮件是必填字段,因此无法删除该属性。
  • 当然,但首先你必须确定问题出在哪里,对吧?
【解决方案3】:

事实证明,我们也可以使用以下代码验证特定属性并检查 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")) 

用上面的方法修改登录代码就可以了。

感谢大家的支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 2017-10-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多