2014-03-31 199 views
0

我會嘗試儘可能最好地說出這一點。 讓我們假設我有控制器X的一個方法:MVC ActionResult方法,參數如何匹配?

Index(string someString) 

這是有效的? :X /索引

或者我需要:X /索引/ someString

(所有這一切都使用默認路由配置)。

現在,是有可能有第二個方法,使:

Index(stringSomestring) 
{ 
.. 
} 

Index() 
{ 
} 

如果是這樣,如何MVC路線選擇正確的方法是什麼?

最後...

之間有什麼區別:聲明參數默認值在routeConfiguration,或方法的參數本身 ?

例如:

rotes.Add("", "etcetc", new {someString = string.Empty); 

VS

Index(string someString = string.Empty) 

感謝和抱歉,如果它太傻了或冗長。

----編輯----- 感謝您的反應anaximander,你幫我清除了一些頭(雖然還在掙扎)。 考慮一下:

routes.MapRoute("", 
       "Student/Sort-By{sortType}", 
       new { controller="Student", action="Index", sortType= ""} 
       ); 

我有一個方法:

Index(string sortType) 
{ 
... 
} 

如果我提供了一個網址:學生/排序,ByDate 它工作正常。 如果我提供了一個網址:學生/排序,通過 發現什麼都沒有,但我的方法對空排序選項...

我覺得我過於複雜/做一些愚蠢的,但不能查明是什麼:(

回答

2

這取決於你的路由設置。默認路由如下所示:

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

請注意UrlParameter.Optional部分。這意味着你可以去somehost.com/X/Index,它會尋找一個方法Index(),或者你可以添加另一個斜槓和一個參數,它會查找Index(foo id),其中foo是你喜歡的任何類型。

路線以您添加它們的順序應用。這意味着,如果你開始你的RouteConfig頂部向下讀,那樣會匹配URL中的第一個是一個,它會使用。這就是爲什麼你應該把更多的具體路線上述更普遍的 - 否則,一般的線路將捕獲所有的URL和被停止使用更具體的路線。

系統查找:

  • 該URL的{controller}部分匹配的控制器(或默認的控制器如果該URL沒有指定一個)
  • 該控制器匹配上的所有操作方法URL的{action}部分(或者URL未指定的部分)
  • 這些方法中的參數名稱與URL中提取的參數集合相匹配,並與路由中指定的參數名稱相匹配。
    • 這意味着對於方法Index(int id),如果URL包含{id}部分,它將使用該方法。如果這部分不存在,但路線指定一個默認值,然後它會使用帶有默認值的方法。如果沒有價值,沒有默認值,參數被標記爲UrlParameter.Optional,它會尋找不需要id另一種方法。 (如果參數是必需的,那麼這條路線將不會匹配,因爲URL沒有提供。)
    • 如果系統無法確定您要撥打哪個方法,您將獲得例外情況告訴你路線不明確。

所以,你的情況,如果你希望能夠使用somehost.com/X/IndexIndex(string someString),那麼你就需要這樣的路線:

routes.MapRoute(
    name: "Index", 
    url: "{controller}/{action}/{someString}", 
    defaults: new { controller = "X", action = "Index", someString = String.Empty } 
); 

它將調用Index(string someString)與如果URL沒有給出空字符串。如果您希望沒有someString參數的網址轉到Index,那麼您可以設置somestring = UrlParameter.Optional,如果URL沒有提供參數,它會查找不需要的方法。如果你離開someString出違約的全部,那麼任何URL不提供一個將是這條路線無效,將不得不改爲搭配一些其他的途徑。如果您仍然在底部提供了預先提供的默認路由,則它會捕獲somehost.com/X/Index,因爲它適合該模板,因此它會假定您已省略可選的id參數並查找諸如Index()之類的方法。

編輯:

當組合URL絨毛和參數,這樣,就有點麻煩。如果不能夠自己運行調試,我猜想,至於系統方面,匹配​​時,該字符串Sort-By"Sort-By" + "",這是"Sort-By" + null。也就是說,URL不給的{sortType}值作爲一個空字符串,因爲空字符串是仍然是一個字符串,而這個URL包含沒有在那個位置所有字符串。如果網址未提供{sortType}的值並且未標記爲可選,則該網址與此路線不匹配。這可能會更好地工作爲:

routes.MapRoute("", 
    "Student/Sort/{sortType}", 
    new { controller="Student", action="Index", sortType= ""} 
); 

此外,也可以考慮從URL下降排序和使用查詢參數,所以路由變爲

routes.MapRoute("", 
    "Student/", 
    new { controller="Student", action="Index", sortBy= ""} 
); 

和整理你去host.com/Student/?sortBy=Date

+0

這樣一個很好的解釋,但我仍然困惑......這不是你的錯,我只是很難找到我的頭。檢查那裏的編輯,看看我有什麼麻煩:) –

+0

編輯 - 奇數。我發現,如果我把一個隨機值,除了空的任何東西,路線被使用。如果我使用string.Empty或「」它不。我認爲它根本不接受那個空話。多麼奇怪...... –

+0

啊......我沒有看到你的第二個評論,直到我更新了我的答案之後,你所說的話似乎支持我的假設。 – anaximander

0

你不能有幾個指數()爲您的路由

如果你想爲使用X /指數或X /索引/ someText

您必須聲明的ActionResult指數(字符串someString)

路由進程將知道Index可以接受一個String,然後它將重定向到正確的動作。您不需要呈現字符串可空或指定空字符串。該字符串將僅爲null。

爲了「猜測」正確的操作,我認爲mvc框架使用反射並將參數的類型和名稱關聯起來。

路由過程會一直工作,但如果你想指定將與默認方式不同的路線,那麼你將有:

rotes.Add("", "etcetc", new {someString = string.Empty); 
+0

感謝:間)差:rotes.Add( 「」, 「etcetc」,新的{someString =的String.Empty); 和 指數(串someString =的String.Empty)? –

相關問題