2013-05-20 64 views
1

我有一個ASP.NET Web應用程序項目,我實現了一個WebApi控制器,現在繼續使用MVC控制器。未使用默認設置調用控制器操作「索引」

我添加了一個新的MVC控制器(例如「Test」),並選擇添加它爲「空讀寫操作」。

控制器是使用各種CRUD方法創建的,但Index操作意外行爲。

默認情況下,Index動作不帶任何參數:如果我嘗試調用使用URL「/Test/Index」這種方法

public ActionResult Index() 
{ 
    return View(); 
} 

現在,該方法不會被調用。

但是,如果我輸入url「/Test/Index/1Index行動運行。

在我看來,它涉及到的路由,所以我檢查了RouteConfig類的樣子:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

Id設置爲可選的,我的理解是,我不應該被要求在提供的參數值索引方法?

我創建了另一個項目,並檢查了這種行爲,它工作正常。

想知道在這個項目中,MVC控制器的行爲有什麼不同?

混合WebApi控制器與MVC控制器有一些副作用(使它成爲一種特殊情況)?

讓我知道你是否需要任何信息來回答這個問題。


更新:

我做了修改WebApiConfig製作API控制工作,按照我的要求,它看起來像這樣:

public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "{controller}/{action}", 
      defaults: new { controller = "iclock", action = "cdata" } 
     ); 
    } 

我不明白爲什麼它會影響MVC控制器路線?我現在提供了答案。


更新2:

在這種情況下的問題是我不能(或可以嗎?)的作爲第三方設備網絡API的路由前綴API被髮送GET和使用固定的URL POST請求,如下:

GET /iclock/cdata?SN=xxxxxx&options=all&pushver=2.0.2&language=XX 
GET /iclock/cdata?SN=xxxxxx&type=time 
POST /iclock/cdata?SN=123456&table=ATTLOG&Stamp=2011-04-05T17:40:20 

我實現了以上請求處理功能,使WebApiConfig路由的變化。現在需要一個前端UI,我正在開發一個帶有CRUD操作的MVC控制器。

在這種情況下什麼應該是理想的方法?

+0

除非web api控制器在相同的路徑上監聽,否則它應該不會影響你的mvc控制器。 –

回答

3

在您導航到測試/索引它不知道是否應該使用網絡的路由那裏有一個可選的「ID這可能是「或者沒有」id「的api路線。如果可能,我會在MVC Web API模板中描述的前綴Web API路由前綴,例如「api/{controller}/{action}」。

對於第二個示例,訪問該API的應用程序會簡單地在URL前加上「api /」。如果他們正在使用您指定的URL並且無法更改,那麼我認爲您可能會被卡住,因爲請求進入時仍然存在不知道使用哪條路徑的問題。

如果可以更改URL,如上所述,使用「api /」的簡單前綴。

編輯:根據提供的額外信息/代碼片段更新我的答案。 編輯:再次更新

+0

感謝您的更新答案。是的,這些網址被固定爲第三方設備,它們使用這些固定的URL來推送數據。我將根據Web API路線修改我的MVC路線。 – SBirthare

1

你有沒有在WebApiConfig而不是RouteConfig看在App_Start

public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
+0

請參閱我的更新,自定義路由與我們是否衝突bapi路線? – SBirthare

1

你的路由表中有衝突。您的Web API路由表現在與標準MVC路由表相同。您的Web API路由表(使用MapHttpRoute初始化的表)應該聲明爲:routeTemplate: "api/{controller}/{id}"。此外,您不應該修改Web API路由。它不是一成不變的,它必須是api/{controller}/{id},但有一定的約定,您應該遵循儘量正在重置您的路線,像下面這樣,然後再試一次:。

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

所以,首先恢復至正常路由配置和測試之後,使變化緩慢,並按照結果

相關問題