视图中的控制器在编辑后不会更新视图模型

时间:2019-02-01 21:40:26

标签: c# razor asp.net-core asp.net-core-2.2

我有以下表格。

@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)
{ ... }

尽管我基于the docs,但我将输入框的值绑定到模型中的字段,但显然没有。不确定如何进一步诊断。

1 个答案:

答案 0 :(得分:2)

我认为您可能由于以下原因而将原始数据绑定回去:

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

我认为这会将原始模型作为参数发送回控制器,而忽略了表单中的参数。

删除该行并将其替换为

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

编辑:

根据评论进行了更新。

经过测试可以正常工作,看起来[FromQuery]也是一个问题,因此只需取回viewmodel即可。

控制器代码:

  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>