2016-01-04 28 views
2

我教自己的MVC和有一個問題有正確的路由參數在MVC沒有被正確地傳遞給視圖從路由

我有一個控制器名爲「ClipsController」和內部名稱爲「指數」 1個視圖(無聊的,我知道)

我已經配置了以下路線我routeconfig文件:

routes.MapRoute(
    "Clips", 
    "Clips/{id}", 
    new { controller = "Clips", action = "Index", id = urlparameters.Optional } 
); 

這是 「默認」 路由前。當我去/ Clips/ExampleID 它確實擊中了正確的路線,並確實在剪輯控制器中啓動索引操作。我遇到的問題是參數'ID'無法通過索引頁面,但我最終處於剪輯控制器的索引操作,其URL爲domain.my/Clips/ExampleID

I嘗試獲取ID參數

httpcontext.current.request.querystring["id"] 

總是返回空值。我在控制器的ActionResult如下:

public ActionResult Index(string id) 
{ 
    return view() 
} 

要重申,我無法看到的索引視圖查詢字符串ID,即使網址不正確的路線,並在控制器中的ActionResult是以我的名譽正確。如果我做了一些嚴重錯誤的事情或者需要更多信息,請讓我知道,謝謝。

+0

你試過的網址是什麼? 'youriste.com/clips/anystring'應該和你提供的信息一起工作。 – Shyju

+0

這就是爲什麼你的動作需要param,'id'。這將使用路線中的值填充,因此這是您在操作中應該使用的值。在你訪問的URL中沒有查詢字符串,所以試圖從'QueryString'訪問任何東西都會返回null。 –

回答

4

我試圖與獲得ID參數

httpcontext.current.request.querystring [ 「身份證」]

不,你沒有在該URL查詢字符串參數:

http://domain.my/Clips/ExampleID 

查詢字符串參數遵循URL中的?字符。例如,如果你有以下網址:

http://domain.my/Clips?id=ExampleID 

,那麼你可以嘗試使用您最初的代碼讀取id查詢字符串參數。

使用此地址:http://domain.my/Clips/ExampleID您可以查詢id路由值參數。但使用HttpContext.Current絕對是這樣做的錯誤方法。您絕對不應該在ASP.NET MVC應用程序中使用HttpContext.Current。恰恰相反,您可以在任何地方訪問HttpContextBase(在ASP中幾乎無處不在)訪問此信息。NET MVC應用程序管道):

httpContext.Request.RequestContext.RouteData.Values["id"] 

長話短說,如果你需要查詢您的控制器動作裏面這個參數的值,則只需使用提供id說法:可能

public ActionResult Index(string id) 
{ 
    // Here the id argument will map to ExampleID 
    return view() 
} 

你也不需要你自定義路由:

routes.MapRoute(
    "Clips", 
    "Clips/{id}", 
    new { controller = "Clips", action = "Index", id = urlparameters.Optional } 
); 

這是完全多餘的,它已經被默認路由覆蓋:

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

因此,感覺不僅僅是免費擺脫您的自定義路線。

+0

我想使用自定義路由進行學習,我知道默認會抓住它,我只是想讓它不顯示剪輯/索引/ ID。 所以對於URL 'domain.my/clips/IdIWantToGet' 我會用 httpContext.Request.RequestContext.RouteData.Values [ 「身份證」] ,它會返回字符串 'IdIWantToGet'? –

+0

是的,如果您需要在控制器操作之外的某處訪問此值。在你的控制器動作中,你可以簡單地使用'id'參數。但是你沒有完全指定你需要訪問這個值的地方。如果你在視圖中需要它,那麼顯然你不會使用'httpContext.Request.RequestContext.RouteData.Values [「id」]'。你可以在你的控制器動作中使用一個視圖模型,該模型將有一個ID屬性從你的控制器動作所採用的'id'參數中填充。 –

+0

好的,這有助於我更好地理解MVC過程,所以我會給你正確的答案。非常感謝你 –

相關問題