2011-12-01 80 views
3

我正在使用ASP.NET MVC 3.我对它很陌生。我想我已经开始掌握它了。但有一些我正在努力做的,我认为是有道理的,但也许我错了。使用ASP.NET MVC3推荐的API设计

我正在尝试在我的数据库中的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" } 
    ); 
    } 

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

谢谢

+3

你的路由表是什么样的? –

+0

我没有做任何事情。由于该控制器位于Area内,因此我不确定在哪里设置路由。 –

回答

4

您需要在global.asax也定义适当的路由或使用它看起来像{controller}/{action}/{id}中,控制器默认为“家”的默认路由,动作被默认为“索引”和id是可选的。

所以/orders作品,因为你已经定义控制器(单),默认操作(指数)和缺少ID(这并不重要,因为它是可选的)

但是当你尝试/orders/12345然后选择已经定义控制器(订单),行动(12345)和缺少ID

所以为了让只有缺省路由这项工作的要求应该是/orders/index/12345

编辑:登记面积的路线,你应该使用AreaRegistration类

+0

我在这里同意100%+1,只添加如果你想要一个单独的路由,只需将它添加到默认路由之上,并指定/ orders/{id}。 –

+0

这就是我暗示的。 +1 :) –

+0

我添加了以下内容到我的AreaRegistration中,并且我仍然得到一个404“context.MapRoute( ”Order“, ”{controller}/{action}/{id}“, new {action =”Index “,controller =”Orders“} ); –