【发布时间】: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