【发布时间】:2018-10-03 14:52:22
【问题描述】:
我可以让模型绑定在没有属性路由的情况下正常工作 - 例如:
/// <summary>
/// Collect user details
/// </summary>
public IActionResult RegisterDetails(Guid CustomerId)
{
var Details = new Details()
{
CustomerID = CustomerId
};
return View(Details);
}
/// <summary>
/// Save user details in Db if valid
/// </summary>
[HttpPost]
public IActionResult RegisterDetails(Details Details)
{
if (ModelState.IsValid)
{
// Do stuff
}
// Error, return ViewModel to view
return View(RegisterDetails);
}
但我不确定如何将模型传递给处理它的方法。当我提交表单时,它运行原始方法,而不是 [HttpPost] 下的方法 - 它一次又一次地发布到原始方法( // Do stuff 是 - 当我这样做时:
/// <summary>
/// Collect user details
/// </summary>
[Route("Register/Details/{CustomerId}")]
public IActionResult RegisterDetails(Guid CustomerId)
{
var Details = new Details()
{
CustomerID = CustomerId
};
return View(Details);
}
/// <summary>
/// Save user details in Db if valid
/// </summary>
[HttpPost]
[Route("Register/Details")]
public IActionResult RegisterDetails(Details Details)
{
if (ModelState.IsValid)
{
// Do stuff
}
// Error, return ViewModel to view
return View(RegisterDetails);
}
使用属性路由时如何正确绑定模型?
我搜索了 Google - 我发现了一些没有帮助的东西,例如: https://www.red-gate.com/simple-talk/dotnet/asp-net/improved-model-binding-asp-net-core/
谢谢
更新
我还注意到 CustomerId 被附加到 Url,即使在表单发布之后也是如此。我不认为这发生在 MVC 5 中并且不需要这个,CustomerId 隐藏在页面中。
我怎样才能删除它(它导致路由与 [HttpPost] 修饰的方法不匹配。
【问题讨论】:
-
我对问题的措辞有点困惑。
When I submit the form it runs the original method, not the one under [HttpPost] -。在显示的两个中,哪个是原始方法?你这是什么意思 -
非 [HttpPost] 方法 - Get 方法,代码中较高的方法。这就是 MVC 通常的工作方式,对吧……
-
在核心中使用属性时需要明确。放上
[HttpGet]并使用路由约束避免混淆[Route("Register/Details/{CustomerId:guid}")] -
你不需要两者。只需执行
[HttpGet("Register/Details/{CustumerId}]和 `[HttpPost("Register/Details")]。 -
@ChrisPratt IIRC 在文档中他们说您可以将它们用于返回视图的控制器,并且
HttpPost本身我们更多地用于 Restful API。
标签: asp.net-mvc-5 asp.net-core-mvc attributerouting asp.net-core-mvc-2.0 asp.net-core-mvc-2.1