/ /ModelState.IsValidが正しく機能しない-asp.net-mvc、asp.net-mvc-4

ModelState.IsValidが正しく機能しない - asp.net-mvc、asp.net-mvc-4

2つのモデルがあります
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
}
}

そして RegisterUserModel

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

そして、ユーザー登録のビューモデルとしてRegisterUserModelを使用します

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

しかし、たとえば、ユーザーを電子メールに登録しようとすると、 DB、私は Exception.

ディクショナリに渡されるモデルアイテムのタイプは「TaskManager.Models.UserModel」ですが、このディクショナリにはモデルが必要です タイプ「TaskManager.Models.RegisterUserModel」のアイテム。

システム。InvalidOperationException:ディクショナリに渡されるモデルアイテムのタイプは「TaskManager.Models.UserModel」ですが、これは 辞書にはタイプのモデルアイテムが必要です 「TaskManager.Models.RegisterUserModel」。

私は何を間違えましたか?それを修正する方法は?

回答:

回答№1は2

問題は一番下にあります。registerUserではなくView関数にユーザーを渡しています。