/ / ModelState.IsValid nie działa poprawnie — asp.net-mvc, asp.net-mvc-4

ModelState.IsValid nie działa poprawnie - asp.net-mvc, asp.net-mvc-4

Istnieją 2 modele
UserModel

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
}
}

i ZarejestrujModelUżytkownika

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; }
}

i używam RegisterUserModel jako modelu widoku do rejestracji użytkownika

@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>

UserController

[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);
}

ale gdy próbuję na przykład zarejestrować użytkownika z adresem e-mail, który już istnieje w DB, mam Exception.

Element modelu przekazany do słownika jest typu „TaskManager.Models.UserModel”, ale ten słownik wymaga modelu element typu "TaskManager.Models.RegisterUserModel".

System.InvalidOperationException: element modelu przekazany do słownika jest typu „TaskManager.Models.UserModel”, ale to słownik wymaga elementu wzorcowego typu "Menedżer zadań.Modele.ZarejestrujModelUżytkownika".

Co zrobiłem źle? Jak to naprawić?

Odpowiedzi:

2 dla odpowiedzi № 1

Twój problem jest na samym dole, przekazujesz użytkownika do funkcji View zamiast registerUser.