我有一個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。不幸的是,我似乎找到了一個關於我在那個博客中發生的事情的解釋。
問題是:如何?我的意思是他可以親眼看到它的工作原理。他想知道如何:)。我想他可以使用反射器,但這不完全是一個解釋。 – sirrocco 2009-01-22 11:25:03
我認爲這值得一提,因爲他的第一個代碼示例似乎認爲「我需要在這裏提供路線」 – 2009-01-22 11:31:06