0

我正在使用 Asp.NET MVC 4 控制器(不是 WebAPI)来实现真正的 RESTful API,其中单个 URL 需要基于 HTTP 方法类型指向不同的操作方法。

因此,诸如 mysite.com/Widget/1 之类的 URL 可以转到以下三种操作方法中的任何一种:

[HttpPut]
public JSONResult Update(int widgetId) {}

[HttpDelete]
public JSONResult Delete(int widgetId) {}

[HttpGet]
public JSONResult Get(int widgetId) {}

将一个 URL 路由到这些不同的操作方法的最佳方法是什么?

我遇到了ActionName过滤器,我可以将每个操作方法设置为相同。然后,我的 RouteConfig 类将始终指向相同的 ActionName,并且 MVC 将根据 HTTP 方法类型属性选择正确的操作方法。

[HttpPut]
[ActionName("CRUD")]
public JSONResult Update(int widgetId) {}

[HttpDelete]
[ActionName("CRUD")]
public JSONResult Delete(int widgetId) {}

[HttpGet]
[ActionName("CRUD")]
public JSONResult Get(int widgetId) {}

routes.MapRoute(
       name: "Default",
       url: "{controller}/{action}/{id}",
       defaults: new { controller = "Widget", action = "CRUD", id = UrlParameter.Optional }
        );

不过有更好的方法吗?

4

1 回答 1

1

因此,诸如 mysite.com/Widget/1 之类的 URL 可以转到以下三种操作方法中的任何一种:

默认情况下,喜欢的电话mysite.com/Widget/1会转到

[HttpGet]
public JSONResult Get(int widgetId) {}

除非您另外指定,否则如果您正在进行 ajax 调用,您可以使用TYPE属性指定它。例如:TYPE:DELETE

将一个 URL 路由到这些不同的操作方法的最佳方法是什么?

我个人认为您不需要指定[HttpPut]\Delete\Get[ActionName("CRUD")]属性。在您的用例中,只需简单地使用该TYPE属性,就可以有效地实现所有操作。

例子 :

要调用public JSONResult Update(int widgetId) {},请使用

$.ajax({
    url: mysite.com/Widget/1,
    type: "UPDATE",
    success: function (result) {},
    error: function () {}
});

要调用public JSONResult Get(int widgetId) {},请使用

$.ajax({
    url: mysite.com/Widget/1,
    type: "GET",
    success: function (result) {},
    error: function () {}
});

要调用public JSONResult Delete(int widgetId) {},请使用

$.ajax({
    url: mysite.com/Widget/1,
    type: "DELETE",
    success: function (result) {},
    error: function () {}
});

必读

于 2012-11-05T05:24:50.610 回答