Asp.net mvc ModelState.IsValid不';我不能正常工作
有两种型号Asp.net mvc ModelState.IsValid不';我不能正常工作,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,有两种型号 用户模型 using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Web; namespace TaskManager.Model
用户模型
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;
namespace TaskManager.Models
{
public class UserModel
{
private const int NAME_LENGTH = 200;
private const int EMAIL_LENGTH = 100;
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[StringLength(NAME_LENGTH)]
public string Name { get; set; }
[Required]
[EmailAddress]
[StringLength(EMAIL_LENGTH)]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
[StringLength(200)]
public string Password { get; set; }
public string PasswordSalt { get; set; }
[Required]
[DefaultValue(UserType.User)]
public UserType Type { get; set; }
public ICollection<Task> Tasks { get; set; }
}
public enum UserType
{
Admin = 0,
User = 1
}
}
但当我尝试注册用户时,例如,在DB
中已经存在的电子邮件,我得到了一个异常
传递到字典中的模型项的类型为“TaskManager.Models.UserModel”,但此字典需要一个模型
“TaskManager.Models.RegisterUserModel”类型的项
System.InvalidOperationException:传递到字典中的模型项的类型为“TaskManager.Models.UserModel”,但是
字典需要类型为的模型项
“TaskManager.Models.RegisterUserModel”
我做错了什么?如何修复它?您的问题就在底部,您正在将用户传递到视图函数而不是registerUser。错误消息非常清楚。这与Model.IsValid属性也没有任何关系。您返回的模型类型与视图预期的不同。在您的POST操作中,您正在返回一个UserModel,但视图需要RegisterUserModel是的,我不理解它,但我不知道我应该在这里返回哪个模型。实际上我不确定我应该在这里返回哪个模型。您正在传递user,它的类型错误-UserModel。视图文件需要RegisterViewModel类型的内容,因此您需要该类型的内容。我通常会首先使用传递给函数的模型。作为一个侧面点,我根本看不到用户变量中的点。您最好直接从registerUser参数获取数据。是的,您是对的,我现在看到了。非常感谢你的帮助!
public class RegisterUserModel
{
private const int NAME_LENGTH = 200;
private const int EMAIL_LENGTH = 100;
private const int PASSWORD_MIN_LENGTH = 5;
private const int PASSWORD_MAX_LENGTH = 20;
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required]
[StringLength(NAME_LENGTH)]
public string Name { get; set; }
[Required]
[EmailAddress]
[StringLength(EMAIL_LENGTH)]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
[StringLength(PASSWORD_MAX_LENGTH, MinimumLength = PASSWORD_MIN_LENGTH)]
public string Password { get; set; }
public string PasswordSalt { get; set; }
[Required]
[DefaultValue(UserType.User)]
public UserType Type { get; set; }
public ICollection<Task> Tasks { get; set; }
}
@model TaskManager.Models.RegisterUserModel
@{
ViewBag.Title = "Registration";
}
<div class="col-md-6">
<h2>Registration</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<div class="form-group">
@Html.LabelFor(u => u.Name)
@Html.TextBoxFor(u => u.Name, new { @class = "form-control" })
@Html.ValidationMessageFor(u => u.Name, null, new { @class = "error" })
</div>
<div class="form-group">
@Html.LabelFor(u => u.Email)
@Html.TextBoxFor(u => u.Email, new { @class = "form-control" })
@Html.ValidationMessageFor(u => u.Email, null, new { @class = "error" })
</div>
<div class="form-group">
@Html.LabelFor(u => u.Password)
@Html.PasswordFor(u => u.Password, new { @class = "form-control" })
@Html.ValidationMessageFor(u => u.Password, null, new { @class = "error" })
</div>
<div>
<input type="submit" class="btn btn-default" value="Registration" />
</div>
}
</div>
[HttpGet]
public ActionResult Registration()
{
var registerUser = new RegisterUserModel();
return View(registerUser);
}
[HttpPost]
public ActionResult Registration(RegisterUserModel registerUser)
{
var user = new UserModel
{
Name = registerUser.Name,
Email = registerUser.Email,
Password = registerUser.Password
};
if (ModelState.IsValid)
{
if (!IsUserExist(registerUser.Email))
{
var crypto = new SimpleCrypto.PBKDF2();
var encrpPass = crypto.Compute(user.Password);
var newUser = _db.Users.Create();
newUser.Name = user.Name;
newUser.Email = user.Email;
newUser.Type = UserType.User.ToString();
newUser.Password = encrpPass;
newUser.PasswordSalt = crypto.Salt;
_db.Users.Add(newUser);
_db.SaveChanges();
return RedirectToAction("Index", "Task");
}
else
{
ModelState.AddModelError("", User already exists");
}
}
else
{
ModelState.AddModelError("", "Incorrect data");
}
return View(user);
}