将参数传递给控制器​​时为空对象

Null Object When Passing Parameters To Controller

我已经使用了 Asp.Net 帐户注册控制器和视图模型,并尝试对它们进行一些更改以执行以下操作。用户注册帐户后,他将被重定向到下一个页面,其中有两个复选框,如果他想成为卖家或买家,他必须在该页面上 select。提交后,他将在数据库中分配一个编号。这是我到目前为止的代码:

视图模型

public class RegisterViewModel
{
    [Required]
    [EmailAddress]
    [Display(Name = "Email")]
    public string Email { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 8)]
    [Display(Name = "UserName")]
    public string UserName { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }

    //[Required]
    //[Display(Name = "Date Of Birth")]
    public DateTimeOffset UserDOB { get; set; }

    public int? UserRole { get; set; }
    public AspNetUser AspNetUser { get; set; }
    public int Id { get; set; }
    public bool buyer { get; set; }
    public bool seller { get; set; }
}

这是我的注册控制器:

public async Task<ActionResult> Register(RegisterViewModel model, ApplicationUser test)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.UserName, Email = model.Email, UserDOB = model.UserDOB };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);

                return RedirectToAction("Choice", "RoleSelection", new { Id = Guid.NewGuid()});
            }
            AddErrors(result);
        }


        return View(model);
    }

这就是我卡住的地方。该代码不起作用。我认为保存用户信息的字符串 Id 参数或模型存在问题。我想要做的就是将该单个值传递给数据表:

   public ActionResult Choice(string Id)
    {
        using (var db = new FoundationEntities())
        {
            var trans = db.AspNetUsers.Where(x => x.Email == User.Identity.Name).FirstOrDefault();
            return View(trans);
        }
    }


    [HttpPost]
    public ActionResult Choice(RegisterViewModel model, string Id)
    {
        using (var db = new FoundationEntities())
        {
            if (model.buyer == true && model.seller == false)
            {

            var work = db.AspNetUsers.Where(x => x.Email == User.Identity.Name).Select(x => x.UserRole);
                model.UserRole = 3;
                db.SaveChanges();
            }

            if (model.seller == true && model.buyer == false)
            {
                var work = db.AspNetUsers.Where(x => x.Email == User.Identity.Name).Select(x => x.UserRole);
                model.UserRole = 2;
                db.SaveChanges();
            }

        }
        return RedirectToAction("Index", "Home");
    }

我的猜测是路由参数、您传递的内容与预期模型之间存在类型不匹配。

Register 中,您将带有 Guid Id 的匿名对象传递给 Choice。但是 Choice 期望模型期望 RegisterViewModel 类型和 string Id.

解决此问题的一种方法是将您的 Choice 签名更改为

Choice(RegisterViewModel model, Guid Id)

你用

打给 RedirectToAction
RedirectToAction("Choice", "RoleSelection", new {model, Id = Guid.NewGuid()})