删除未命中的路线

Posted

技术标签:

【中文标题】删除未命中的路线【英文标题】:Delete route not being hit 【发布时间】:2017-05-19 04:00:06 【问题描述】:

与这个问题作斗争太久了,现在是时候寻求帮助了。我的 .net core mvc 应用程序的删除路线没有被击中。所有其他路线(获取,发布)都很好。启动时的路由配置如下:

    app.UseMvc(routes =>
    
        routes.MapRoute(
            name: "default",
            template: "controller/action/id?");
    );

表单提交看起来像这样:

    <a class="btn btn-primary" href="~/DisabledRegistrations/Delete/@(Model.Id)">Confirm</a>

控制器方法如下所示:

[Authorize]
[HttpDelete]
public async Task<IActionResult> Delete(string id)

  ...

但是用类似的东西来解决这个问题:

https://localhost:8307/DisabledRegistrations/Delete/f17dff6b3fcd43ba89eab4bbad5c992e

结果:

No webpage was found for the web address: 
https://localhost:8307/DisabledRegistrations/Delete/f17dff6b3fcd43ba89eab4bbad5c992e

我们在 Service Fabric 中运行,但不确定是否有任何细节。我们的 web.config 有这个,但不确定它是否与该上下文相关:

  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
    </handlers>

非常感谢任何有关尝试的提示。

更新:

如果我确实提交了如下表格:

<form asp-controller="DisabledRegistrations" asp-action="Delete" method="delete" asp-route-id="@Model.Id">
    <div class="text-right">
        <button type="submit" class="btn btn-primary">Confirm</button>
        <a class="btn btn-primary" href="~/DisabledRegistrations/Index">Cancel</a>
    </div>
</form>

那我还是得到:

No webpage was found for the web address: 
https://localhost:8307/DisabledRegistrations/Delete/f17dff6b3fcd43ba89eab4bbad5c992e?__RequestVerificationToken=CfDJ8KwmDf2MXHlGrC8zIIntu4IV_83R9jSBwPqk3w8Ymq2VoBnQHN8lxEOHqMUfJwtxX-HLZwr6AWw8uKiVaSz7l-CZjPzZ_IxJhRh31MYiwbgsJzLcQMvrHWGd_sueZ8OLKbRAoYGeVHLfVfkjac-TCaLE9CoOYSCyhY4EDtrFhiLVY3_3h-bJTSLYTT2E7qXcvA

【问题讨论】:

提交是否使用了DELETE动词?我不认为删除对表单的方法属性有效吗? 它在 VS 中显示为方法属性的有效选项。 是的,我不会相信的。相信浏览器在请求检查期间告诉你的内容:***.com/questions/5162960/… hmmm...你说得对,fiddler 显示它正在执行 GET:GET /DisabledRegistrations/Delete/f17dff6b3fcd43ba89eab4bbad5c992e?... 让它使用 POST 动词和 Delete 操作。现在就足够了。感谢您的帮助! 【参考方案1】:
[HttpDelete]

是一个类似于 post 的动词,您没有从您的链接中执行 http 删除,而只是在执行 http get,因此它与您的路线不匹配。要删除动词,您必须使用 ajax 并指定动词。

您没有提交表单,您只显示了一个链接因此不会删除动词的元素

【讨论】:

我的错,我也打算包括我的表单提交代码(我尝试了各种方法)但错过了。我已经用该信息更新了 OP。还是同样的问题。 我不认为网络浏览器支持删除或将动词放入表单方法,所以你需要 ajax 来做到这一点,它并没有真正使用那个动词,因此它不匹配路由。您可以将删除方法更改为 HttpPost 并将表单方法更改为发布。但要使用删除动词,我认为你必须使用 ajax 谢谢乔,根据我在 OP 下方的评论,这就是我所做的。 通过使用 HTTP 方法转换,您可以使用 POST 提交表单,其中包含一些指定实际方法的特殊字段。然后中间件在进入 MVC 之前更改方法。但我认为这有点 hack,如果它是一个表单,你真的应该使用 POST(因为这会改变数据)。【参考方案2】:

我不完全确定您为什么要使用表单来执行此操作。 标签会很容易地为你做这件事。

<div class="text-right">
    <a class="btn btn-primary" asp-controller="DisabledRegistrations" asp-action="Delete" asp-route-id="@Model.Id">Confirm</a>
    <a class="btn btn-primary" href="~/DisabledRegistrations/Index">Cancel</a>
</div>

【讨论】:

以上是关于删除未命中的路线的主要内容,如果未能解决你的问题,请参考以下文章

Ehcache中的“缓存未命中”和“内存缓存未命中”有啥区别?

5 分钟快速学习,缓存一致性优化方案!

是否有销毁方法的路线?

什么被认为是缓存中的高未命中率/低命中率?

是啥导致我的代码中的缓存未命中?

未命中 aspx 代码隐藏中的 Webmethod