c# - .NET 核心 2.2。尝试删除时如何摆脱此 HTTP 405 错误?
问题描述
尝试使用删除进行简单发布时出现 405 错误。我可以很好地读取、写入和更新,但无法弄清楚为什么 Visual Studio 2017(或者,更具体地说,IIS Express)不允许我执行删除。
互联网上有很多关于 的帖子web.config
,但它们是较旧的帖子,较新的帖子不起作用。事实上,我相信web.config
我的项目中没有包含因为微软正在朝着.appsettings.json
我在 Docker 容器中运行带有 .NET Core 2.2 的 Visual Studio 2017 v15.9.11。我没有运气切换到 IIS Express。我已经查看了applicationhost.config
IIS Express 的文件,并且 WebDav 已经被注释掉了。我相信它发生在 Web 服务器级别,因为在调试时我没有受到控制器的影响。我最好的猜测是某处的默认设置不允许删除;我就是找不到。
模型
namespace Efficacy.Models.Entities
{
/* dbo.Contact.Contact */
public class Contact
{
private const string V = "First Name";
public int Id { get; set; }
public ContactType ContactType { get; set; }
public int ContactTypeId { get; set; }
[Required]
//[Display( Description = ("Delete")]
public string FirstName { get; set; }
public string MiddleName { get; set; }
[Required]
public string LastName { get; set; }
}
}
数据库上下文
namespace Efficacy.Data
{
public class EfficacyDBContext : DbContext
{
public virtual DbSet<Contact> Contact { get; protected set; }
public virtual DbSet<ContactType> ContactType { get; protected set; }
public virtual DbSet<HelloNurse> HelloNurse { get; protected set; }
public EfficacyDBContext(DbContextOptions options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfiguration(new ContactEntityTypeConfiguration());
modelBuilder.ApplyConfiguration(new ContactTypeEntityTypeConfiguration());
}
}
}
控制器
namespace Efficacy.Areas.Ops.Controllers
{
[Area("Ops")]
public class ContactController : Controller
{
private readonly EfficacyDBContext _db;
public ContactController(EfficacyDBContext db)
{
_db = db;
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> ContactDelete(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));
}
…
看法
@model Efficacy.Models.Entities.Contact
@{
ViewData["Title"] = "Add Contact";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<div class="container-fluid">
<div class="row">
<div class="col-6">
<h2 class="text-info">Add Contact</h2>
</div>
<div class="col-6 text-right">
 
</div>
</div>
<div>
<form method="post" asp-area="Ops" asp-controller="Contact"
asp-action="ContactDelete">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<table class="table table-striped border shadow p-3 mb-5 bg-white rounded">
<tr class="table-secondary">
<th><label asp-for="FirstName">First Name</label></th>
<th><label asp-for="MiddleName">Middle</label></th>
<th><label asp-for="LastName">Last Name</label></th>
<th><label asp-for="ContactTypeId">Contact Type</label></th>
<th class="text-right"> </th>
</tr>
<tr>
<td>
<input asp-for="FirstName" class="form-control"
value="@Model.FirstName" />
<span asp-validation-for="FirstName"
class="text-danger"></span>
</td>
<td>
<input asp-for="MiddleName" class="form-control"
value="@Model.MiddleName" />
<span asp-validation-for="FirstName"
class="text-danger"></span>
</td>
<td>
<input asp-for="LastName" class="form-control"
value="@Model.LastName" />
<span asp-validation-for="FirstName"
class="text-danger"></span>
</td>
<td>
@* TODO: Bind *@
<select name="ContactTypeId" class="form-control">
<option value="1">Organization</option>
<option value="2">Lead</option>
<option value="3">Event</option>
<option value="4">Invoice</option>
<option value="5">Contact</option>
</select>
</td>
<td class="text-right">
<input type="submit" class="btn btn-info form-control mb-1"
asp-route-id="@Model.Id" value="Save" />
<a asp-area="ops" asp-controller="Contact"
asp-action="ContactDelete" asp-route-id="@Model.Id"
class="btn btn-danger form-control mb-1">Delete</a>
<a asp-action="Index"
class="btn btn-success form-control">Cancel</a>
</td>
</tr>
</table>
</form>
</div>
</div>
控制台输出
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 GET https://localhost:44382/Ops/Contact/ContactDelete/11
[40m[32minfo[39m[22m[49m: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
Request starting HTTP/1.1 GET https://localhost:44382/Ops/Contact/ContactDelete/11
[40m[32minfo[39m[22m[49m: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
Executing endpoint '405 HTTP Method Not Supported'
Microsoft.AspNetCore.Routing.EndpointMiddleware:Information: Executing endpoint '405 HTTP Method Not Supported'
Microsoft.AspNetCore.Routing.EndpointMiddleware:Information: Executed endpoint '405 HTTP Method Not Supported'
[40m[32minfo[39m[22m[49m: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
Executed endpoint '405 HTTP Method Not Supported'
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 14.0081ms 405
启动.cs
app.UseMvc(routes =>
{
routes.MapRoute(
name: "areas",
template: "{area=Ops}/{controller=Home}/{action=Index}/{id?}");
});
解决方案
405
HTTP 代码意味着Method Not Allowed
. Served 返回此错误,因为操作需要POST
请求(因为它已标记为[HttpPost]
),并且当用户单击锚标记 ( <a>
) 时,浏览器会发送GET
请求。为了发送POST
,您需要使用form
标签
<form method="post" asp-action="ContactDelete" asp-area="Ops" asp-controller="Contact">
<input name="Id" value="@item.Id" type="hidden" /> <!-- hidden input contains Id value -->
<button type="submit">Delete</button>
</form>
您还具有[ValidateAntiForgeryToken]
该操作的属性,因此需要发送防伪令牌。FormTagHelper会自动为您生成隐藏input
的令牌,因此您无需执行任何其他操作。
推荐阅读
- javascript - Simplifying writing this JSON-object in TypeScript
- reactjs - 无法读取未定义的属性“currentUser”。googleUser 值是否与 Google oauth2 中的 currentUser 相同?
- reactjs - 0.59 RN 更新后获取返回 blob 而不是文本
- php - Codeigniter 在本地 mamp 上将 2.0.2 升级到 3.1.10 会话问题
- sql - Mode-within-group equivalent in Presto
- php - 无法将 JSON 响应从 windows-1253 转换为 utf8
- python - 如何更改熊猫中单元格、列的宽度?
- r - 如何引用数据框的列名,该列名与使用“mutate”时要访问的函数不同?
- etl - 多个临时表的 CDC 策略
- pkcs#11 - 在哪里可以找到 luna safenet 客户端日志?