2012-06-26 124 views
1

我需要地图创建控制器什么是必须应对两个URL:类似路由映射

  1. 的“http://本地主机/ API /控制器ID = 1”(其中仅值ID可以改变)
  2. 的 “http://本地主机/ API /控制器/ anotherId/someconst”(其中anotherId是唯一一个变化部分)

我将其映射到这样的路由:

routes.MapHttpRoute("Test", "api/{controller}/{id}/{someconst}", new { controller = "Test", someconst = RouteParameter.Optional }); 

而且必须在我的控制器方法:

public void Get(int id) { ... } 
public void Get(int anotherId, string someconst) { ... } 

它的工作原理......不过,这并不好看......导致“串someconst”是不是设置了一个param,它的URL的只是一个常量的一部分。但是,如果我删除“字符串someconst”参数第二个网址将无法正常工作。 是否有可能将一个控制器映射到两个路径来解析这个url,使其清晰无误地假设这是一个常量?

+1

你的意思是说你想在控制器上做另一个动作吗?你可以说“api/{controller}/{id}/{action}”,然后代替调用它“public void Get(int anotherId,string someconst)”,你可以把它叫做“public void GetSomeConst(int anotherId)”。只要确保你设置了你的默认行动 – parKing

+0

我完全不理解你,但认为你是对的...我找到了同样的解决方案...谢谢 –

回答

1

嗯,我得到了答案......只是有路线...

routes.MapHttpRoute("Test", "api/{controller}/{id}", new { controller = "Test", action = "Get", id= @"\d+");); 

routes.MapHttpRoute("TestSomeConst", "api/{controller}/{anotherId}/someconst", new { controller = "Test", action = "GetSomeconst", anotherId= @"\d+"); 

和更改控制器方法(行动):

public void Get(int id) { ... } 
public void GetSomeconst(int anotherId) { ... } 
+0

移动到答案,我可以更好地解释。 – parKing

0

有一件事你可以尝试做是映射这样的路线:

routes.MapHttpRoute("Test", "api/{controller}/{id}/{action}", new { controller = "Test", action = "Get", id= @"\d+"}); 

,使您的操作:

public void Get(int id) { ... } 

[HttpGet] 
public void Someconst(int id) { ... } 

因为你的行动默认为“获取”的方法,你可以忽略,并称之为:

http://localhost/api/test/1 

如果你想打电话给你的另一种方法,你可以使用

http://localhost/api/test/1/someconst 
+0

你确定这会行吗?我完全复制你的代码,它不......只是第一个方法被解雇 –

+0

我改变了一下代码,我运行了一个简单的测试应用程序和更新的代码。我对控制器/动作命名如何工作有点困惑。出于某种原因,我认为你不需要在请求中明确getomeconst端点的“get”,但你确实需要。与“[HttpGet]”属性,你不必。 – parKing