我有以下表格。
@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,但我将输入框的值绑定到模型中的字段,但显然没有。不确定如何进一步诊断。
答案 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>