Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET核心2.2。在尝试删除时,如何消除此HTTP 405错误?_C#_Asp.net Core_Iis Express_Asp.net Core 2.2 - Fatal编程技术网

C# .NET核心2.2。在尝试删除时,如何消除此HTTP 405错误?

C# .NET核心2.2。在尝试删除时,如何消除此HTTP 405错误?,c#,asp.net-core,iis-express,asp.net-core-2.2,C#,Asp.net Core,Iis Express,Asp.net Core 2.2,当我试图用删除来写一篇简单的文章时,我遇到了一个405错误。我可以很好地读、写和更新,但无法理解为什么Visual Studio 2017或更具体地说,IIS Express不允许我执行删除 互联网上有很多关于web.config的帖子,但它们都是较旧的帖子,而最近的帖子则不起作用。事实上,我的项目中没有包含web.config,因为我相信微软正在向appsettings.json迈进 我正在Docker容器中运行Visual Studio 2017 v15.9.11,其中包含.NET Core

当我试图用删除来写一篇简单的文章时,我遇到了一个405错误。我可以很好地读、写和更新,但无法理解为什么Visual Studio 2017或更具体地说,IIS Express不允许我执行删除

互联网上有很多关于web.config的帖子,但它们都是较旧的帖子,而最近的帖子则不起作用。事实上,我的项目中没有包含web.config,因为我相信微软正在向appsettings.json迈进

我正在Docker容器中运行Visual Studio 2017 v15.9.11,其中包含.NET Core 2.2。我转用IIS Express,运气不好。我已经查看了IIS Express的applicationhost.config文件,WebDav已经被注释掉了。我相信这是在web服务器级别发生的,因为我在调试时并没有对控制器产生影响。我最好的猜测是,某个地方有一个默认设置不允许删除;我就是找不到

模型 namespace.Models.Entities { /*dbo.Contact.Contact*/ 公共类联系人 { private const string V=名字; 公共int Id{get;set;} 公共ContactType ContactType{get;set;} public int ContactTypeId{get;set;} [必需] //[显示说明=删除] 公共字符串名{get;set;} 公共字符串MiddleName{get;set;} [必需] 公共字符串LastName{get;set;} } } DBContext 名称空间。数据 { 公共类EfficacyDBContext:DbContext { 公共虚拟数据库集联系人{get;protected set;} 公共虚拟数据库集联系人类型{get;protected set;} 公共虚拟数据库集hellonUsers{get;protected set;} public efficyDBContextDBContextOptions选项:基本选项 { } 在ModelCreatingModelBuilder上受保护的覆盖无效modelBuilder { modelBuilder.ApplyConfiguration新建ContactEntityTypeConfiguration; modelBuilder.ApplyConfiguration新建ContactTypeEntityTypeConfiguration; } } } 控制器 名称空间:1.Areas.Ops.Controllers { [区域行动] 公共类ContactController:控制器 { 私有只读EfficicybContext _db; 公共联系人控制器官方代码上下文数据库 { _db=db; } [HttpPost] [ValidateAntiForgeryToken] 公共异步任务ContactDeleteint id { var contact=await _db.contact.FindAsyncid; 如果contact==null { 返回未找到; } _db.Contact.Removecontact; wait_db.SaveChangesAsync; 返回RedirectToActionnameofIndex; } … 看法 Startup.cs app.UseMvcroutes=> { routes.MapRoute 名称:区域, 模板:{area=Ops}/{controller=Home}/{action=Index}/{id?}; };
我相信你的问题是路由问题 你能试试这个吗

    [HttpPost("id")] <----------
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> ContactDelete([FromRoute(Name = "id" )] int id) <----------
    {
        var contact = await _db.Contact.FindAsync(id);

        if (contact == null)
        {
            return NotFound();
        }

        _db.Contact.Remove(contact);
        await _db.SaveChangesAsync();

        return RedirectToAction(nameof(Index));
    }

我相信你的问题是路由问题 你能试试这个吗

    [HttpPost("id")] <----------
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> ContactDelete([FromRoute(Name = "id" )] int id) <----------
    {
        var contact = await _db.Contact.FindAsync(id);

        if (contact == null)
        {
            return NotFound();
        }

        _db.Contact.Remove(contact);
        await _db.SaveChangesAsync();

        return RedirectToAction(nameof(Index));
    }

405 HTTP代码表示不允许使用方法。已服务返回此错误,因为操作需要POST请求,因为它标记为[HttpPost]当用户单击锚定标记时,标记将自动为您生成带有此令牌的隐藏输入,这样您就不需要执行任何其他操作。

405 HTTP代码表示不允许使用此方法。SERVICED返回此错误,因为操作需要POST请求,因为它标记为[HttpPost]当用户单击锚定标记时,该标记将自动为您生成带有此标记的隐藏输入,这样您就不需要执行任何其他操作。

当您使用POST方法时,最好将id包含在表单范围的隐藏元素中,并将其与其他值一起发送:

<input type="hidden" asp-for="@Model.Id" />
我看到您正在尝试更新和删除同一表单。那么您应该使用两个具有不同操作的提交按钮

<button type="submit" asp-action="Save" asp-controller="Contact" asp-area="Ops" class="btn  form-control">
  <span>Update</span>
</button> 

<button type="submit" asp-action="ContactDelete" asp-controller="Contact" asp-area="Ops" class="btn form-control">
  <span>Delete</span>
</button>
还有一件事…删除表单元素中的控制器、操作和区域标记,并让提交按钮处理:

  <form asp-action="" method="post" enctype="multipart/form-data">

使用POST方法时,最好在表单范围的隐藏元素中包含id,并将其与其他值一起发送:

<input type="hidden" asp-for="@Model.Id" />
我看到您正在尝试更新和删除同一表单。那么您应该使用两个具有不同操作的提交按钮

<button type="submit" asp-action="Save" asp-controller="Contact" asp-area="Ops" class="btn  form-control">
  <span>Update</span>
</button> 

<button type="submit" asp-action="ContactDelete" asp-controller="Contact" asp-area="Ops" class="btn form-control">
  <span>Delete</span>
</button>
还有一件事…删除表单元素中的控制器、操作和区域标记,并让提交按钮处理:

  <form asp-action="" method="post" enctype="multipart/form-data">

您的通话中是否包含防伪令牌?您是否使用HTTP从客户端删除?@Tachyon我对此进行了调查,但MS表示,对于core 2.0及以上版本,当出现“method=post”时,会自动生成令牌。[link][link]我在源代码中确认了令牌。@aa如果调用从视图No Javascript中呈现为表单post,您的调用中是否包含防伪令牌?您是否使用客户端的HTTP DELETE?@Tachyon我对此进行了研究,但MS表示,对于core 2.0及以上版本,当存在“method=post”时,会自动生成令牌。[link][link]I配置
irmed源中的令牌。@aa如果调用是从视图中呈现为表单post,则没有JavascriptI检查我的源,并且那里有一个防伪令牌。我认为我不需要Razor页面视图上的Taghelper,因为MS说:当标记包含method=post时,会自动生成HTML表单元素的反伪造标记。您是否有一个视图中的小代码片段可以与我共享?到目前为止,我已经尝试@Html.AntiForgeryToken,我正在添加一个表单标记。我的错。我只是想尽量缩短我的帖子。这是我正在使用的标记:我已经在源代码中包含了我的完整视图。@Alexamder你是对的。在查看了标题之后,我发现这是一个405 GET请求,因为我使用的是Delete…而不是input post元素。嗯。表格101。非常感谢。我查了我的来源,那里有一个防伪令牌。我认为我不需要Razor页面视图上的Taghelper,因为MS说:当标记包含method=post时,会自动生成HTML表单元素的反伪造标记。您是否有一个视图中的小代码片段可以与我共享?到目前为止,我已经尝试@Html.AntiForgeryToken,我正在添加一个表单标记。我的错。我只是想尽量缩短我的帖子。这是我正在使用的标记:我已经在源代码中包含了我的完整视图。@Alexamder你是对的。在查看了标题之后,我发现这是一个405 GET请求,因为我使用的是Delete…而不是input post元素。嗯。表格101。非常感谢。