2009-01-22 50 views
1

我有一個ASP.NET MVC應用程序兩個路由規則:ASP.NET MVC對於它的路由文件太聰明瞭,我不知道該怎麼做!

  routes.MapRoute(
       "Products AJAX", 
       "Products/Ajax/{action}", 
       new { controller = "Products" } 
      ); 

      routes.MapRoute(
       "Product",            
       "Products/{id}",           
       new { controller = "Products", action = "ViewProduct", id = "1001" } 
      ); 

這裏的第二條規則允許我創建一個URL /Products/1002查看產品1002這是我創建了原來單一的規則。

我想補充的觀點有些AJAX,使其能夠獲取一個簡單的字符串:

public class ProductsController : Controller { 
    public ContentResult GetStatus() 
     { 
      return new ContentResult() 
      { 
       Content = "Status is OK at " + DateTime.Now.ToLongTimeString() 
      }; 
     } 
    } 

這就是爲什麼我添加上面的第一個路由規則。我希望它是一個更具體的URL,可以用於我的控制器中定義的任何其他操作。 (如果我沒有這個規則,它會嘗試找到一個產品的SKU'GetStatus',這是不好的!)

所以我認爲那好吧,我只需要在我的視圖中寫我的AJAX命令爲:

<%= Ajax.ActionLink("Update Status", "AJAX/GetStatus", new AjaxOptions { UpdateTargetId = "status" })%> 

我以爲這會調用鏈接Products/AJAX/GetStatus,這將觸發第一個路由規則,正確地去我控制器的getStatus方法。

令我驚訝的是,當我將鼠標懸停在Internet Explorer(或查看源代碼)上的此命令時,URL變爲/Products/AJAX/AJAX/GetStatus

所以我在想着whaaat,我回到了一些偵探工作。

我我的第一條規則更改爲:

MapRoute(
       "Products AJAX", 
       "Products/Foo/{action}", 
       new { controller = "Products" } 
      ); 

,我改變我的行動來

<%= Ajax.ActionLink("Update Status", "GetStatus", new AjaxOptions { UpdateTargetId = "status" })%> 

令我驚訝這個ActionLink的生成的URL實際上是/產品/美孚/的getStatus。這基於我的第一條規則正確轉發到我的AJAX處理程序,一切都很好。當然,/產品/ 1003的鏈接將匹配第二條規則並轉到產品1003.

我的應用程序已完成!我很高興 - 有點。

但我不知道爲什麼!只有在我的整個代碼庫中,我有Foo的位置在我的映射規則中,那麼Ajax.ActionLink如何能夠找出我想要的鏈接?

顯然有一種'聰明'的反向映射正在完成。我似乎找不到任何關於此的文檔,並想知道更多。

我認爲它必須解析它找到的FIRST規則或類似的東西,但是由於我喜歡知道發生了什麼,所以它看起來有點可怕。

注意:關於路由有一個very nice article - 包括從ScottGu的博客上的路由表生成URL。不幸的是,我似乎找到了一個關於我在那個博客中發生的事情的解釋。

回答

1

既然你有一個命名路線,爲什麼不使用它?改爲使用Ajax.RouteLink,並指定路由名稱。那麼你不必擔心ASP.NET「猜測」錯誤的路線。它不會傷害任何this is faster, too

0

是的,這就是ActionLink helper和路由的要點 - 如果你改變了整個路由結構,你只需要在一個地方更新它,ActionLinks就可以繼續生成正確的URL。

要詳細一點。此外,當你使用ActionLink的幫手,你基本上說來系統「鏈接到控制器和動作,我不在乎如何這樣做了」

+0

問題是:如何?我的意思是他可以親眼看到它的工作原理。他想知道如何:)。我想他可以使用反射器,但這不完全是一個解釋。 – sirrocco 2009-01-22 11:25:03

+0

我認爲這值得一提,因爲他的第一個代碼示例似乎認爲「我需要在這裏提供路線」 – 2009-01-22 11:31:06