视图中的控制器在编辑时不会更新视图模型
Controller in view doesn't update the view model upon being edited
我有以下表格。
@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 将输入框的值绑定到模型中的字段,但显然我没有。不确定如何进一步诊断。
我认为您可能由于以下行而绑定了原始数据:
asp-all-route-data="@Model.Querify"
我认为这是将原始模型作为参数发送回控制器并忽略您表单中的参数。
删除该行并将其替换为
asp-route-returnurl="@Model.ReturnUrl"
编辑:
根据评论更新。
经测试可以正常工作,看起来 [FromQuery] 也是一个问题,因此只需取回视图模型即可。
控制器代码:
public IActionResult Sec()
{
var viewModel = new LoginVm();
viewModel.ReturnUrl = "http://whosebug.com";
return View(viewModel);
}
[HttpPost]
public IActionResult Sec(LoginVm viewModel)
{
return Redirect(viewModel.ReturnUrl);
}
视图模型:
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>
我有以下表格。
@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 将输入框的值绑定到模型中的字段,但显然我没有。不确定如何进一步诊断。
我认为您可能由于以下行而绑定了原始数据:
asp-all-route-data="@Model.Querify"
我认为这是将原始模型作为参数发送回控制器并忽略您表单中的参数。
删除该行并将其替换为
asp-route-returnurl="@Model.ReturnUrl"
编辑:
根据评论更新。
经测试可以正常工作,看起来 [FromQuery] 也是一个问题,因此只需取回视图模型即可。
控制器代码:
public IActionResult Sec()
{
var viewModel = new LoginVm();
viewModel.ReturnUrl = "http://whosebug.com";
return View(viewModel);
}
[HttpPost]
public IActionResult Sec(LoginVm viewModel)
{
return Redirect(viewModel.ReturnUrl);
}
视图模型:
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>