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"))