Asp.Net Core:如何正确地将数据从视图传递到控制器?

时间:2019-06-08 18:39:24

标签: asp.net-core-2.0

我正在尝试使用视图模型将一些数据从视图传递到控制器。

在视野中,我有类似的东西:

@model LoginRegisterViewModel
<input type="text" name="Email" id="Email" placeholder="Email">
<input type="password" class="form-control" name="Password" id="Password" placeholder="Password">

查看模型:

 public class LoginModel
    {
        [DataType(DataType.EmailAddress)]
        public string Email { get; set; }

        [DataType(DataType.Password)]
        public string Password { get; set; }

        [Display(Name = "Remember Me")]
        public bool RememberMe { get; set; }
        public string ReturnUrl { get; set; }
    }

    public class RegisterModel
    {
        public string Username { get; set; }

        [DataType(DataType.EmailAddress)]
        public string Email { get; set; }

        [DataType(DataType.Password)]
        public string Password { get; set; }

        public string ReturnUrl { get; set; }
    }

    public class ResetModel
    {

        [DataType(DataType.EmailAddress)]
        public string Email { get; set; }
        public string ReturnUrl { get; set; }

    }

    public class LoginRegisterViewModel
    {
        public LoginModel Login { get; set; }
        public RegisterModel Register { get; set; }
        public ResetModel Reset { get; set; }
    }

在控制器中:

 public async Task<IActionResult> Login(LoginRegisterViewModel model, string returnUrl = null)
        {
            returnUrl = returnUrl ?? Url.Content("~/");

            if (ModelState.IsValid)
            {                
                var userOrEmail = model.Login.Email;

               SignInResult result;

                if (userOrEmail.IndexOf('@') > 0)
                    result = await _signInManager.PasswordEmailSignInAsync(userOrEmail, model.Login.Password, model.Login.RememberMe, false);
                else

                result = await _signInManager.PasswordSignInAsync(userOrEmail, model.Login.Password, model.Login.RememberMe, lockoutOnFailure: false);
                if (result.Succeeded)
                {
                    return LocalRedirect(returnUrl);
                }

                else
                {
                    ModelState.AddModelError(string.Empty, "Invalid login attempt.");
                    return View(model);
                }
            }

            return View(model);
        }

我做错了事,因为出现以下错误:NullReferenceException:对象引用未设置为对象的实例。 引用此行:var userOrEmail = model.Login.Email;

2 个答案:

答案 0 :(得分:1)

您绑定了错误的属性。

控制器动作期望的对象类型为LoginRegisterViewModel,,这是视图所期望的模型的类型,但是控件绑定到错误的属性。

例如<input type="text" name="Email" id="Email" placeholder="Email">映射到model.Email(其中model是LoginRegisterViewModel的对象),并且LoginRegisterViewModel没有Email属性,但是具有{{1 }}属性具有Email属性,因此您应该将输入绑定到LoginModel

Ps:您可以使用MVC核心标签助手将属性绑定到模型

model.Login.Email

甚至是剃刀语法    <input asp-for="model.Login.Email" name="anyothername" class="form-control" />

答案 1 :(得分:0)

就知道了。我应该在视图中使用name =“ Login.Email”和name =“ Login.Password”。