Ядро Asp.Net: Как правильно передавать данные из представления в контроллер? - PullRequest
0 голосов
/ 08 июня 2019

Я пытаюсь передать некоторые данные из представления в контроллер, используя модель представления.

В связи с этим у меня есть что-то вроде:

@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 ]

1 голос
/ 08 июня 2019

вы связываете неправильные свойства.

Действие контроллера ожидает объект типа LoginRegisterViewModel,, и это тип модели, которую ожидает ваше представление, но ваши элементы управления связываются с неправильным свойством.

например <input type="text" name="Email" id="Email" placeholder="Email"> это сопоставляется с model.Email (где модель является объектом LoginRegisterViewModel), а LoginRegisterViewModel не имеет свойства Email, но имеет свойство LoginModel со свойством Email поэтому вы должны связать свой ввод с model.Login.Email.

PS: вы можете использовать основные помощники тегов MVC, чтобы привязать свойства к модели

<input asp-for="model.Login.Email" name="anyothername" class="form-control" />

или даже синтаксис бритвы @Html.EditorFor(model => model.Login.Email)

0 голосов
/ 08 июня 2019

Только что получил.Я должен был использовать name = "Login.Email" и name = "Login.Password" в представлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...