2013-10-28 56 views
1

這可能是一個非常簡單的事情,但谷歌無力無法讓我到任何地方。多個URL路由到一個單一的行動方法

在我們構建的Web應用程序中,我們有項目和模板。模板實際上只是項目,IsTemplate標誌設置爲true。很自然地,我們有一個處理(或處理)這兩種情況的Project控制器。

我們有一個路線在控制器上New操作方法:

Project/New

這只是標準{controller}/{action}/{id}路由處理一個。現在,New操作方法有一個IsTemplate參數。我想有一個,途徑是在爲假傳遞(上面的),並在它作爲真正傳遞的第二個:

Templates/New

什麼是掩蓋任意操作方法的正確方法參數與這樣的不同的URL?我嘗試以下,但它只是混淆路由(Html.ActionLink結束了在Templates/New指向):

routes.MapRoute(
    null, 
    "Template/New", 
    new { controller = "Project", action = "New", IsTemplate = true } 
); 

或者這將是一個簡單得多,我只是拆分此爲2種action方法,並將這些調用具有硬編碼參數值的單個私人控制器方法?

+0

這樣就可以解決這個問題了(我假設你沒有觸及默認路徑)。另一種可能性是使用[ActionName](http://stackoverflow.com/questions/6536559/purpose-of-actionname)。另一種可能性是創建一個隱含的操作,稱爲模板/新模板,只調用project/new(isTemplate = true)。 – pasty

回答

1

看起來這可能是最簡單的選擇。我將單個New操作方法拆分爲兩個操作方法,這兩個方法定義了不同的路由,第三個私有方法完成所有工作。如果有更漂亮的方法,我仍然樂於接受建議。

[HttpGet] 
//Action method for a new template 
public ActionResult NewTemplate() { 
    return New(true, null); 
} 

[HttpGet] 
//Action method for a new project 
public ActionResult New(int? TemplateProjectID) { 
    return New(false, TemplateProjectID); 
} 

private ActionResult New(bool IsTemplate, int? TemplateProjectID) { 
    //Assorted code follows 
+0

我想我只會爲此解決,因爲它相對簡單,我們不需要將其縮放到無限數量的不同URL。 – db2

0

也許RouteUrl可以幫到你嗎? 如果命名TemplateNew例如路線,你應該能夠爲創建一個URL:

<a href="@Url.RouteUrl("TemplateNew")">New Template</a> 
相關問題