繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM