Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ModelState.IsValid不';我不能正常工作_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

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