ASP.NET MVC3推荐的API设计

时间:2011-12-01 20:38:55

标签: asp.net-mvc-3

我正在使用ASP.NET MVC 3.我有点新手。我想我已经开始了解它。但是我想要做的事情,我认为是有道理的,但也许我错了。

我正在尝试在数据库中的Order对象周围创建API。为了获得系统中的所有订单,我将公开一个如下所示的API:

/命令/

如果我想获得特定订单,我只需附加一个ID。换句话说,URL将如下所示:

/命令/ 12345

为了实现这一目标,我创建了以下控制器:

public class OrdersController : Controller
{
    // GET: /Orders/
    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Index()
    {
        string result = "list of orders";
        return Json(result, JsonRequestBehavior.AllowGet);
    }

    //
    // GET: /Orders/{orderID}
    public ActionResult Index(int id)
    {
        string result = "order:" + id;
        return Json(result, JsonRequestBehavior.AllowGet);
    }
}

在我的AreaRegistration课程中,我有以下内容:

  public override void RegisterArea(AreaRegistrationContext context)
  {
    context.MapRoute(
      "OrderList",
      "{controller}/{action}",
        new { action = "Index", controller="Orders" }
    );

    context.MapRoute(
      "Order",
      "{controller}/{action}/{id}",
      new { action = "Index", controller = "Orders" }
    );
  }

当我尝试通过浏览器地址栏访问“/ orders /”时,我得到的JSON就像我期望的那样。但是,如果我尝试访问“/ orders / 12345”,我会收到404.我错过了什么?

谢谢

1 个答案:

答案 0 :(得分:4)

您还需要在global.asax中定义正确的路由,或者使用默认路由,该路由看起来像{controller}/{action}/{id},其中控制器默认为“Home”,操作默认为“Index”,id是可选的。

所以/orders有效,因为你已经定义了控制器(订单),默认操作(索引)和缺少的id(这无关紧要,因为它是可选的)

但是当您尝试/orders/12345时,您已经定义了控制器(订单),操作(12345)和缺少ID

因此,为了使此工作仅使用默认路由,请求应为/orders/index/12345

编辑:对于注册区域路线,您应该使用AreaRegistration类