Asp.net core mvc 为什么在脚手架代码中发布编辑操作时,要对照模型/隐藏输入中的ID检查URL中的ID?

Asp.net core mvc 为什么在脚手架代码中发布编辑操作时,要对照模型/隐藏输入中的ID检查URL中的ID?,asp.net-core-mvc,asp.net-mvc-controller,Asp.net Core Mvc,Asp.net Mvc Controller,如果您使用VisualStudio框架代码创建一个“带视图的MVC控制器,使用实体框架”,则会创建一个编辑方法来响应POST。此方法包含一个检查if(id!=movie.id),该检查似乎没有实际值。在以下情况中使用相同的模式: [HttpPost] [ValidateAntiForgeryToken] 公共异步任务编辑(int-id,[Bind(“id,Title,ReleaseDate,流派,Price”)]电影) { if(id!=movie.id) { 返回NotFound(); } .

如果您使用VisualStudio框架代码创建一个“带视图的MVC控制器,使用实体框架”,则会创建一个编辑方法来响应POST。此方法包含一个检查
if(id!=movie.id)
,该检查似乎没有实际值。在以下情况中使用相同的模式:

[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务编辑(int-id,[Bind(“id,Title,ReleaseDate,流派,Price”)]电影)
{
if(id!=movie.id)
{
返回NotFound();
}
...
文件状态

HttpGet Edit方法采用电影ID参数,使用实体框架FindAsync方法查找电影,并将所选电影返回到编辑视图。如果找不到电影,则返回NotFound(HTTP 404)

  • 这张支票的目的是什么
  • 它似乎没有真正的价值-客户端似乎正在发送这两个价值
  • 我应该拿走它吗?我应该保留它吗

我认为这只是一个健全的检查,以确保客户端发布到的ID与客户端在POST请求中附加的数据中的ID匹配

如果用户使用视图中的表单提交POST请求,我看不出您如何获得不同的ID值。但如果客户提交表单而不使用您的视图,则这些ID值可能会不同。例如,可以使用Postman

如果POST URL是
/movie/edit/7
,但POST body的ID是6,例如,您的应用程序/您需要决定要做什么。因此,作为开发人员,您需要确定它是否有价值,并添加这样的检查

如果是POST请求,我通常会忽略URL中的ID。如果URL是构造良好的RESTful API端点,那么URL上不应该有ID。因此,我的控制器将只处理来自POST后视图模型的数据:

[HttpPost]
//[ValidateAntiForgeryToken]-我认为ASP.NET核心MVC会自动启用该功能
公共异步任务编辑(MovieViewModel vm)
{
if(ModelState.IsValid)
{
...
}
...
}
根据

架子工会产生这种情况。请随意移除它。在某些情况下,可能需要它


就像我说的,这取决于你,开发人员,来判断它是否有价值,开发人员需要理解为什么他可以/不能删除这样的支票。
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("ID,Title,ReleaseDate,Genre,Price")] Movie movie)
{
    if (id != movie.ID)
    {
        return NotFound();
    }
    ...