【问题标题】:Execute web controller action without view [c#]在没有视图的情况下执行 Web 控制器操作 [c#]
【发布时间】:2019-03-04 10:10:28
【问题描述】:

我有一个数据表,它从数据库中获取值,最后一列的每一行都有一个删除按钮。

$"<button type='submit'  class='btn btn-danger test' id='{i.id}' onclick='return Delete();'>Delete</button>"

我的按钮获得一个 id,它是该行中模型的 id。

如果我单击按钮,我想删除该行。 但是如果我的应用程序没有尝试找到视图,就无法弄清楚如何调用该方法。 (我没有删除视图,也不想创建一个)。 我查过了,但没有任何效果。

我的控制器操作:

    [Authorize(Roles = "user")]
    [HttpDelete]
    public ActionResult Delete(Guid id)
    {
        if (BLayer.getAllGames().ToList().Exists(x => x.id == id))
        {
            BLayer.DeleteGame(id);
        }

        return new EmptyResult();
    }

我的 Jquery 函数:

function Delete() {
    var table = $("#tableOverviewGames").DataTable();
    $('#tableOverviewGames tbody').on('click', 'button', function () {
        var idGame = $(this).attr('id');
        $.ajax({
            url: "Delete",
            type: 'DELETE',
            data: { id: idGame },
            async: false,
            contentType: false,
            success: function (data) {
                alert("Vous avez supprimé le jeu");
            },
            error: function (data) {
                console.log(data);
            }
        });
    });

}

有人可以帮帮我吗?

谢谢!

编辑:

这是我在控制台中遇到的错误:

DELETE http://localhost:3673/Game/Delete 404 (Not Found)

【问题讨论】:

  • 建议你先使用[HttpPost]type:'POST',然后你可以改用正确的动词。
  • {i.id} / $(this).attr('id') 的实际值是多少 - 如果不能匹配参数,则会失败
  • @freedomn-m 我使它适用于帖子,但不适用于删除。不确定是什么导致了问题。 i.id 的值是一个 Guid,但我猜它在 jquery 中被视为字符串

标签: c# jquery asp.net-mvc controller


【解决方案1】:

为什么不直接从控制器返回一个 JSON,例如

return Json(new {success = true})

然后您可以(如果需要)检查 ajax 是否成功

【讨论】:

  • 我仍然收到以下错误 'DELETE localhost:3673/Game/Delete 404 (Not Found)'
  • @Jeremy 将 HttpDelete 替换为 HttpPost。将您的类型更改为“POST”。更改contentType:'Application/json'。删除这行async: false,最后在这种情况下最好使用@Url.Action("Delete", "//TheController"),因为“删除”是一个非常常见的函数名称
  • 我更改了内容并在我的控制器操作上放置了一个断点,但它似乎没有到达控制器并且我收到以下错误:jquery-3.3.1.js:9600 POST http://localhost:3673/Game/Delete 500 (Internal Server Error)。知道它可能是什么吗?
  • @Jeremy 如果你使用的是谷歌浏览器,开发工具的网络部分是什么意思
  • @Jeremy 是的,对不起,我没看到。如果您要么将 ID 字符串化并将参数更改为控制器方法中的字符串,要么创建一个诸如 var json = '{id: "' + idGame + '"}' 之类的 json,然后将其作为 ajax 调用中的数据传递,您应该到达控制器
【解决方案2】:

我看到当你打电话时你传递了错误的 Uri,这就是你得到 404 NOT FOUND 的原因。

将您的 HttpDelete 属性更改为

[HttpDelete("{id}")]

http://localhost:3673/Game/eef63296-6bb3-40a5-aa89-be69e75a66eb 一样将 guid 作为 Uri 的一部分传递,除非添加 Content-Length 标头,否则任何传递给删除调用的正文都将被忽略,请检查此 link

如果你还是坚持要一个body,试试下图改签名

[Authorize(Roles = "user")]
[HttpPost("delete")] //Added route to differentiate Create/Insert REST end point
public ActionResult Delete([FromBody]Guid id)

你的 AJAX 调用应该是这样的

$.ajax({
 url: "Delete",
 type: 'DELETE',
 data: idGame, // Pass value directly.
 sync: false,
 contentType: false,
 success: function (data) {
 alert("Vous avez supprimé le jeu");
},

如果我是你,我会开始使用基本类型(如字符串)来测试引起问题的字段。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
相关资源
最近更新 更多