C# 如何解决ASP NET Core 3.1 MVC项目中的HttpPut错误405?

C# 如何解决ASP NET Core 3.1 MVC项目中的HttpPut错误405?,c#,asp.net,.net,asp.net-core,asp.net-core-mvc,C#,Asp.net,.net,Asp.net Core,Asp.net Core Mvc,我有一个运动控制器和两个同名的方法 [HttpGet] public async Task<IActionResult> Update(int exerciseId) { Exercise exercise = (await this.exerciseService.GetExercises(exercise => exercise.Id == exerciseId)).FirstOrDefault(); return View(exercise); } [H

我有一个运动控制器和两个同名的方法

[HttpGet]
public async Task<IActionResult> Update(int exerciseId)
{
    Exercise exercise = (await this.exerciseService.GetExercises(exercise => exercise.Id == exerciseId)).FirstOrDefault();
    return View(exercise);
}

[HttpPut]
public async Task<IActionResult> Update(Exercise exercise)
{
    if (ModelState.IsValid)
    {
        await this.exerciseService.EditExercise(exercise);
        return RedirectToAction("some-view-which-doesnt-matter-in-my-case");
    }
    return View(exercise);
}
[HttpGet]
公共异步任务更新(int exerciseId)
{
Exercise Exercise=(等待这个.exerciseService.GetExercises(Exercise=>Exercise.Id==exerciseId)).FirstOrDefault();
返回视图(练习);
}
[HttpPut]
公共异步任务更新(练习)
{
if(ModelState.IsValid)
{
等待这个.exerciseService.EditExercise(exercise);
return RedirectToAction(“对我来说无关紧要的一些视图”);
}
返回视图(练习);
}
我希望使用类似的名称,以便在各个视图中呈现验证错误。但我目前面临的问题是HttpPut方法的错误405。在我的情况下,我如何解决它?我读过一些关于编辑/添加web.config的文章,内容类似于“remove name=“WebDAVModule”,但1)这些文章是关于.NET core的早期版本的2)即使我添加了web.config,内容如下

<system.webServer>
  <modules runAllManagedModulesForAllRequests="false">
    <remove name="WebDAVModule" />
  </modules>
</system.webServer>

…如果引用了IIS Express引发的异常,则项目根本无法启动。那我该怎么办?我的“更新”视图是:

@model DomainModels.Exercise
@{
ViewData[“标题”]=“更新”;
}
更新@Model.Name
运动设置:




练习分析范围设置:










在Asp.Net Core中,同一控制器上不能有两个同名的方法

您应该更改其中一个方法的名称,并使用
[ActionName()]
属性使两个方法的方法路由相同

[HttpGet]
public async Task<IActionResult> Update(int exerciseId)
{
    Exercise exercise = (await this.exerciseService.GetExercises(exercise => exercise.Id == exerciseId)).FirstOrDefault();
    return View(exercise);
}

[HttpPut]
[ActionName("Update")]
public async Task<IActionResult> UpdatePut(Exercise exercise)
{
    if (ModelState.IsValid)
    {
        await this.exerciseService.EditExercise(exercise);
        return RedirectToAction("some-view-which-doesnt-matter-in-my-case");
    }
    return View(exercise);
}
[HttpGet]
公共异步任务更新(int exerciseId)
{
Exercise Exercise=(等待这个.exerciseService.GetExercises(Exercise=>Exercise.Id==exerciseId)).FirstOrDefault();
返回视图(练习);
}
[HttpPut]
[行动名称(“更新”)]
公共异步任务更新输出(练习)
{
if(ModelState.IsValid)
{
等待这个.exerciseService.EditExercise(exercise);
return RedirectToAction(“对我来说无关紧要的一些视图”);
}
返回视图(练习);
}

解决方案非常简单:只需扔掉HttpPut,更改操作名称并手动设置重定向视图。最后的代码是:

public async Task<IActionResult> UpdateExercise(Exercise exercise)
        {
            if (ModelState.IsValid)
            {
                await this.exerciseService.EditExercise(exercise);

                return RedirectToAction("UpdateIndex");
            }
            return View("Update", exercise);
        }
public async Task UpdateExercise(练习)
{
if(ModelState.IsValid)
{
等待这个.exerciseService.EditExercise(exercise);
返回重定向操作(“更新索引”);
}
返回视图(“更新”,练习);
}
因此,chenge将动作名称放在视图中

<form method="put" asp-controller="Exercise" asp-action="UpdateExercise">


顺便说一句,HttpDelete方法也是如此:去掉HttpDelete

他不是特别要求两个相同的方法名称吗?在问题中,他说:“我想使用类似的名称,以便在各自的视图中呈现验证错误。”。在我的回答中,我很清楚方法不能有相同的名称,但使用ActionName属性,它将以相同的路径响应。只因http动词不同。我相信它正确地回答了这个问题。如果你不同意,请指出哪里出了问题,我会尽快解决。没问题。有时我误解了这个问题。有人检查总是好的。根据Microsoft指南,您的端点不应包含get、create、update、delete单词,操作由HTTP指定。此操作根本不起作用,提交表单后将转到
[HttpGet]update(int exerciseId)
方法
<form method="put" asp-controller="Exercise" asp-action="UpdateExercise">