[英]How to resolve HttpPut Error 405 in ASP NET Core 3.1 MVC project?
我有一个运动控制器和两个同名的方法
[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);
}
我想使用相似的名称来在相应的视图中呈现验证错误。 但我目前面临的问题是 HttpPut 方法中的错误 405。 我该如何解决它? 我已经阅读了一些关于编辑/添加 web.config 的文章,例如“删除名称=“WebDAVModule””,但是 1) 这些文章是关于 .NET 核心的早期版本 2) 即使我添加了 web.config 的内容,例如
<system.webServer>
<modules runAllManagedModulesForAllRequests="false">
<remove name="WebDAVModule" />
</modules>
</system.webServer>
...该项目根本无法启动,并引用了 IIS Express 引发的异常。 那我该怎么办? 我的“更新”视图是:
@model DomainModels.Exercise
@{
ViewData["Title"] = "Update";
}
<h1>Update @Model.Name</h1>
<div>
<form method="put" asp-controller="Exercise" asp-action="Update">
<div asp-validation-summary="ModelOnly">
</div>
<div>
<h3>Exercise settings:</h3>
<input hidden asp-for="Id" />
<div>
<label asp-for="Name"></label><br />
<input asp-for="Name" />
<span asp-validation-for="Name"></span>
</div>
<div>
<label asp-for="FractureFixNumber"></label><br />
<input asp-for="FractureFixNumber" />
<span asp-validation-for="FractureFixNumber"></span>
</div>
<div>
<label asp-for="DislocationFixNumber"></label><br />
<input asp-for="DislocationFixNumber" />
<span asp-validation-for="DislocationFixNumber"></span>
</div>
<div>
<label asp-for="SprainFixNumber"></label><br />
<input asp-for="SprainFixNumber" />
<span asp-validation-for="SprainFixNumber"></span>
</div>
</div>
<div>
<h3>Exercise analysis range settings:</h3>
<input hidden asp-for="ExerciseAnalysisRange.ExerciseId" />
<div>
<label asp-for="ExerciseAnalysisRange.MinAnalysis1"></label><br />
<input asp-for="ExerciseAnalysisRange.MinAnalysis1" />
<span asp-validation-for="ExerciseAnalysisRange.MinAnalysis1"></span>
</div>
<div>
<label asp-for="ExerciseAnalysisRange.MaxAnalysis1"></label><br />
<input asp-for="ExerciseAnalysisRange.MaxAnalysis1" />
<span asp-validation-for="ExerciseAnalysisRange.MaxAnalysis1"></span>
</div>
<div>
<label asp-for="ExerciseAnalysisRange.MinAnalysis2"></label><br />
<input asp-for="ExerciseAnalysisRange.MinAnalysis2" />
<span asp-validation-for="ExerciseAnalysisRange.MinAnalysis2"></span>
</div>
<div>
<label asp-for="ExerciseAnalysisRange.MaxAnalysis2"></label><br />
<input asp-for="ExerciseAnalysisRange.MaxAnalysis2" />
<span asp-validation-for="ExerciseAnalysisRange.MaxAnalysis2"></span>
</div>
<div>
<label asp-for="ExerciseAnalysisRange.MinHighPressure"></label><br />
<input asp-for="ExerciseAnalysisRange.MinHighPressure" />
<span asp-validation-for="ExerciseAnalysisRange.MinHighPressure"></span>
</div>
<div>
<label asp-for="ExerciseAnalysisRange.MaxHighPressure"></label><br />
<input asp-for="ExerciseAnalysisRange.MaxHighPressure" />
<span asp-validation-for="ExerciseAnalysisRange.MaxHighPressure"></span>
</div>
<div>
<label asp-for="ExerciseAnalysisRange.MinLowPressure"></label><br />
<input asp-for="ExerciseAnalysisRange.MinLowPressure" />
<span asp-validation-for="ExerciseAnalysisRange.MinLowPressure"></span>
</div>
<div>
<label asp-for="ExerciseAnalysisRange.MaxLowPressure"></label><br />
<input asp-for="ExerciseAnalysisRange.MaxLowPressure" />
<span asp-validation-for="ExerciseAnalysisRange.MaxLowPressure"></span>
</div>
<div>
<label asp-for="ExerciseAnalysisRange.MinHeartBeats"></label><br />
<input asp-for="ExerciseAnalysisRange.MinHeartBeats" />
<span asp-validation-for="ExerciseAnalysisRange.MinHeartBeats"></span>
</div>
<div>
<label asp-for="ExerciseAnalysisRange.MaxHeartBeats"></label><br />
<input asp-for="ExerciseAnalysisRange.MaxHeartBeats" />
<span asp-validation-for="ExerciseAnalysisRange.MaxHeartBeats"></span>
</div>
<input type="submit" value="Update exercise" />
</div>
</form>
</div>
你不能在 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);
}
解决方案非常简单:只需丢弃 HttpPut,更改操作名称并手动设置重定向视图。 最后的代码是:
public async Task<IActionResult> UpdateExercise(Exercise exercise)
{
if (ModelState.IsValid)
{
await this.exerciseService.EditExercise(exercise);
return RedirectToAction("UpdateIndex");
}
return View("Update", exercise);
}
因此,在视图中更改 PUT 操作名称...
<form method="put" asp-controller="Exercise" asp-action="UpdateExercise">
顺便说一下,HttpDelete 方法也是如此:去掉 HttpDelete
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.