为什么在发布删除操作时,它会设法通过我的操作

时间:2017-01-30 16:00:38

标签: asp.net-mvc

我有一个删除按钮,它嵌套在一个方法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回复后做了一些测试:

我为每种类型创建了一个表单:

  • 获取
  • 发布(使用http methodoverride删除)
  • 获取(使用http methodoverride删除)

这是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标记为我希望传递给它的东西。

1 个答案:

答案 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)
{
}