C# mvc4声明模型类-困境

C# mvc4声明模型类-困境,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,下面是我的用户模型类 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("Las

下面是我的用户模型类

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>
 }
假设我创建了一个新类,名为
UserRegisterViewModel
,包含注册表单所需的所有属性,在这种情况下,我需要将这个UserRegisterViewModel再次转换为User,这样可以吗,还是会增加内存开销

转换会是什么样子

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

请帮助。

在这种情况下,每个视图应该有一个类。如果在Visual Studio中从internet模板创建MVC项目,则默认情况下会生成此类/模型。如果需要,可以使用继承。
不过,也有一些可能避免使用多个模型,但我认为每个视图使用一个模型更简洁、更快。

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

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

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

事实证明,我们还可以验证特定属性,并使用以下代码检查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")) 
用上面的代码更改登录名,效果很好


感谢大家的支持。

启动一个新的MVC Internet项目-它包括用于帐户管理的模型/视图/控制器代码。看看MS是怎么做的。我检查了实现,但他们使用了内置的身份验证机制,可能有内部数据库,在我的例子中,我在数据库中配置了用户表。请检查更新的问题。如果您使用不同的视图模型,那么是的,需要在这两个视图模型中都有转换方法(我有时将其作为保存(用户u)放入模型中)。作为一个选项,您可以尝试AutoMapper(内存开销也是如此,但invisibe:)。若你们派生模型,那个么你们可以使用Save()方法重写。@jim,你们可以提供任何链接或演示吗?因为我对这一切都不熟悉,或者你们也可以给出答案。Thanks@AniShroff我的意思是,不必在控制器中分配用户属性,您可以在视图模型的方法(如Save())中进行分配(它应该将模型的属性保存到用户实体中)。我已根据您的建议更新了我的问题,请协助。电子邮件是必填字段,因此无法删除该属性。确定,但首先你必须确定问题出在哪里,对吗?
//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"))