Контроллер в представлении не обновляет модель представления после редактирования - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть следующая форма.

@model LoginVm
<form asp-controller="Sec" 
      asp-action="Authorize"
      asp-all-route-data="@Model.Querify" 
      method="post">
  Email:  <input asp-for="@Model.UserName" /> <br />
  Password: <input asp-for="@Model.Password" /><br />
  <button type="submit">Send</button>
</form>

Модель представления выглядит следующим образом.

public class LoginVm
{
  public string UserName { get; set; }
  public string Password { get; set; }
  public string ReturnUrl { get; set; }

  public IDictionary<string, string> Querify 
    => new Dictionary<string, string>
    {
      { "username", UserName },
      { "password", Password },
      { "returnurl", ReturnUrl }
    };
  }

Однако в способе получения, показанном ниже, только значения, которые записываются вмодель представления до представления присутствует.Итак, что бы я ни вставил в модель представления перед передачей в представление, оно есть.Любые изменения, которые я пытаюсь внести в модель в полях ввода, будут потеряны.

[HttpPost]
public IActionResult Authorize(
  [FromQuery]string returnUrl, 
  [FromQuery]string userName, 
  [FromQuery] string password)
{ ... }

Хотя я основываюсь на документах , которые я привязал значение из поля ввода к полям вмодель но видимо у меня нет.Не уверен, как диагностировать это дальше.

1 Ответ

0 голосов
/ 02 февраля 2019

Я думаю, что вы можете привязать исходные данные обратно из-за строки:

      asp-all-route-data="@Model.Querify" 

Я думаю, что это отправляет исходную модель обратно в контроллер в качестве параметров и игнорирует те, которые в вашей форме.

Удалите эту строку и замените ее на

 asp-route-returnurl="@Model.ReturnUrl"

Редактировать:

Обновлено на основе комментариев.

Протестировано как работающее, похоже на [FromQuery] также является проблемой, поэтому вместо нее нужно просто вернуть видовую модель.

Код контроллера:

  public IActionResult Sec()
    {
        var viewModel = new LoginVm();

        viewModel.ReturnUrl = "http://stackoverflow.com";
        return View(viewModel);
    }

    [HttpPost]
    public IActionResult Sec(LoginVm viewModel)
    {
       return Redirect(viewModel.ReturnUrl);
    }

ViewModel:

     public class LoginVm
{
    public string UserName { get; set; }
    public string Password { get; set; }
    public string ReturnUrl { get; set; }
}

Вид:

 @model LoginVm
<form asp-controller="Authorization"
  asp-action="Sec"   
asp-route-returnurl="@Model.ReturnUrl"
  method="post">
Email:  <input asp-for="@Model.UserName" /> <br />
Password: <input asp-for="@Model.Password" /><br />
<button type="submit">Send</button>
</form>
...