2011-08-09 89 views
7

一些MVC網站已經查詢字符串PARAMS附加到路徑網址(其中我注意到StackOverflow上一樣),比如:追加PARAM = MVC的路線

https://stackoverflow.com/questions/tagged/java頁= 9802 &排序=最新&頁面大小= 15

什麼是具有參數更常規?查詢字符串則params的優點,而不是/ PARAM /值/?

另外,這些參數是如何附加到已經建立的路線?我熟悉使用像「users/details/{id}」等參數來設置mvc路由,但不知道如何配置1個或多個?params使用的路由,如上面的示例url所示?

回答

4

查詢字符串參數都是有用的想要包含非指定參數的默認值只是爲了滿足路徑。

而且你不需要做什麼特別的包括在呈現的網址這些參數。

看看下面的路線,例如:

routes.MapRoute 
(
    "QuestionsTagged", 
    "questions/tagged/{tag}", 
    new { controller = "Questions", action = "Tagged" } 
); 

如果您在使用呈現一個鏈接到該路線:

Url.RouteUrl 
(
    "QuestionsTagged", 
    new 
    { 
     tag = "java", 
     page = 9802, 
     sort = "newest", 
     pagesize = 15 
    } 
) 

...然後路由引擎足夠聰明地看到,路線包含一個名爲tag的參數,並且傳遞的路由值對象也有一些名爲tag的東西,因此它在路由中使用該值。

提供任何路由值是在路線(page,在這種情況下sortpagesize)獲得上漲了作爲查詢字符串參數相應的參數。所以上面的電話Url.RouteUrl將返回/questions/tagged/java?page=9802&sort=newest&pagesize=15

而且你的操作方法可以明確地列出它的簽名,這些參數(促進可讀性和可維護性),或者你可以通過Request.QueryString訪問它們。

public class QuestionsController : Controller 
{ 
    // I can explicitly list the parameters in my signature and let routing do 
    // its magic, like this... 
    public ViewResult Tagged(string tag, int? page, int? pagesize) 
    { 
     // ...or I can grab parameters like this: 
     string sort = Request.QueryString["sort"]; 

     return View(); 
    } 
} 

請注意,action方法的參數不必與路徑中指定的參數相匹配。 (在路由中,我只指定了tag,但操作方法的簽名列表爲tag,pagepagesize。)但是,不是路由參數的操作方法的任何參數都必須是引用或可爲空類型。

1

我通常看到尋呼和濾波的數據作爲查詢字符串參數,因爲它使信息以URI中的用戶通過。如果用戶更改此數據通常也是無害的,因爲它只會過濾您在頁面上看到的數據。任何敏感數據通常都會發布,因爲它不容易被看到或修改,但我認爲要保持URI的清潔並儘可能少地使用quesrystrings。

指定路線時,能夠處理quesrystrings你不需要做任何特殊。它們只是傳遞給您的操作的額外數據。在你的行動中,你需要做一些工作來處理數據。使用上面的查詢字符串必須指定查詢字符串名稱作爲參數名稱,然後指定您期望的任何數據類型。

public ActionResult Index (int page, string sort, int pagesize) 

在這個例子中,頁面將是9802的價值,排序將是「最新」和頁面大小將是當你有多個可選參數,並沒有15

+0

值得一提的是,我發現在某些情況下,ValueType參數需要爲空來滿足不提供它們的情況(即輸入Url是'clean'),因此允許在空值時應用默認值,而不是處理'0'值。 –

+0

感謝您的信息。這一切都是有道理的,我只是想知道你如何生成你的路線之一'並且'將尾部參數追加到路線的末端?有沒有可以適應這種情況的輔助方法? – Marc

+0

@Marc - 您正在尋找'Url.Action',並且可以在這裏找到一種使用類型的示例:http://stackoverflow.com/questions/5818065/how-to-pass-request-querystring-to -url行動 – amurra