我有一个删除按钮,它嵌套在一个方法Post的形式。 @ Html.BeginForm没有用于删除的FormMethod,所以我已经包含了HttpMethodOverride以包含HttpVerbs.Delete。
以下是代码的摘录(它实际上是对话框的一部分,因此是取消按钮):
@using (Html.BeginForm("Delete", "User", FormMethod.Post, new { id = "frm-commit-delete" }))
{
@Html.HttpMethodOverride(HttpVerbs.Delete)
<button id="btn-commit-delete" class="btn btn-danger" type="submit">Delete</button>
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
}
问题是,当我点击“删除”按钮时,它会设法进入我的ActionMethod,它没有用任何HttpVerbs修饰。
例如
public async Task<ActionResult> Delete(Guid id)
{
var user = await _Service.DeleteUser(id);
return RedirectToAction("Index");
}
因此它设法进入此操作并执行代码。如果我添加[HttpGet],它就会停止。如果我添加一个[HttpDelete],它就会通过(正如我所料)。
我的担心(和问题)是为什么它没有属性通过?正如我所料,默认是[HttpGet]。这可能存在安全问题。
修改
我在@ Peter-b回复后做了一些测试:
我为每种类型创建了一个表单:
这是cshtml:
@using (Html.BeginForm("Delete", "Home", new { id = 100 }, FormMethod.Get))
{
<input type="submit" value="Delete by Get" />
}
@using (Html.BeginForm("Delete", "Home", new { id = 100 }, FormMethod.Post, new { id = 100 }))
{
<input type="submit" value="Delete by Post" />
}
@using (Html.BeginForm("Delete", "Home", new { id = 100 }, FormMethod.Post, new { id = 100 }))
{
@Html.HttpMethodOverride(HttpVerbs.Delete)
<input type="submit" value="Delete by Post with HttpMethodOverride Delete" />
}
@using (Html.BeginForm("Delete", "Home", new { id = 100 }, FormMethod.Get, new { id = 100 }))
{
@Html.HttpMethodOverride(HttpVerbs.Delete)
<input type="submit" value="Delete by Get with HttpMethodOverride Delete" />
}
并拥有家庭控制器
public ActionResult Delete(int id)
{
var doSomething = 100;
return View();
}
点击每个按钮进入doSomething
将[HttpDelete]属性添加到删除操作方法后,除了第三个以外,它们都停止了它们。这证明@ peter-b是正确的。
我没有意识到这样的工作是这样的,但我认为将来我可能总是将ActionMethods标记为我希望传递给它的东西。
答案 0 :(得分:1)
[Http....]
属性用作过滤器,允许使用哪些方法,没有这样的属性就没有过滤器,因此允许使用所有方法。
总结:
// No attribute -> will respond to METHOD = POST, GET, DELETE, PUT, ...
public async Task<ActionResult> Delete(Guid id)
{
}
[HttpDelete] // -> will only respond to METHOD = DELETE
public async Task<ActionResult> Delete(Guid id)
{
}