2015-11-18 3 views
0

Есть 2 модели
UserModelModelState.IsValid не работает должным образом

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».

System.InvalidOperationException: Модель элемент передается в словарь типа «TaskManager.Models.UserModel», но это словаря требует модель элемента типа 'TaskManager.Models.RegisterUserModel.

Что я сделал не так? Как это исправить?

+3

Сообщение об ошибке достаточно ясно. и это не имеет ничего общего с свойством Model.IsValid. вы возвращаете модель другого типа, чем ожидаемая в представлении. в вашем действии POST вы возвращаете UserModel, но View нуждается в RegisterUserModel –

+0

Да, я не знаю, но я не знаю, какую модель я должен вернуть сюда. – Heidel

ответ

2

Ваша проблема прямо внизу, вы передаете пользователя в функцию View вместо registerUser.

+0

На самом деле я не уверен, какую модель я должен вернуть сюда. – Heidel

+0

Вы передаете пользователя, который является неправильным типом - UserModel. Файл вида ожидает что-то типа RegisterViewModel, поэтому вам нужно что-то подобное. Обычно я использую модель, которая была передана функции в первую очередь. В качестве боковой точки я вообще не вижу смысла в этой пользовательской переменной. Вы можете также взять данные прямо из параметра registerUser. – wizzardmr42

+0

Да, вы правы, я вижу это сейчас. Большое спасибо за помощь! – Heidel

Смежные вопросы