2012-04-17 79 views
20

我正在使用ASP.Net MVC。這裏是我的代碼片段從命名課程控制器:當構建URL時,URL.Action包含id

public ActionResult List(int id) 
{ 
    var viewmodel.ShowUrl = Url.Action("Show", "Course"); 


    ... 
} 

public ActionResult Show(int id) 
{ 
    ... 
} 

viewmodel.ShowUrl拿起任何值是「ID」參數。所以viewmodel.ShowUrl變成「/ Course/Show/151」(id的值是151);我希望能夠根據用戶交互設置客戶端上的ID部分。我希望viewmodel.ShowUrl的值爲「/ Course/Show」。

這對我來說似乎是一個錯誤。我不告訴Url.Action包含一個id值。它是靠它自己做的。如果我想設置id值,那麼我會做這樣的事情:

var viewmodel.ShowUrl = Url.Action("Show", "Course", new {id = somevalue}); 

那麼,你如何防止MVC添加id值?我可以將viewmodel.ShowUrl硬編碼爲「/ Course/Show」,但這似乎是一個非常糟糕的解決方案。謝謝。

+0

我不能確切地remeber但'Routedata'是'ViewData',這就是爲什麼它的通過。我認爲你可以在'ViewData'對象上做'Url.Action(「Show」,「Course」,new {});'或者清空'RouteData'。 – 2013-08-12 17:15:46

回答

7

我猜你的路由,你沒有指定該ID是一個可選參數。這是示例項目中的默認路由。

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } //Parameter defaults 
); 

注意包含id = UrlParameter.Optional。沒有這些,你會得到你所描述的行爲,因爲它認爲id是強制性的。

請注意,如果您的Show動作並不總是有一個ID,那麼它應該是可以爲空或提供一個默認值。

public ActionResult Show(int? id) 
public ActionResult Show(int id = 0) 

否則,當您嘗試加載沒有id參數的url時,您會收到錯誤消息。

19

在同樣的問題時只需來了,讓你知道,你也可以只使用一個空字符串:

@Url.Action("Show", "Course", new { id = "" }) 
9

我知道這是老了,但我發現這個第一,但不喜歡任何的這些解決方案,所以我一直在尋找,發現https://stackoverflow.com/a/19110921/1130636

您可以使用UrlParameter.Optional來解決這個問題

Url.Action("Show", "Course", new { id = UrlParameter.Optional })