2016-03-06 37 views
1

所以我在MVC根據什麼其他職位提到閱讀routes和配置。所以我的目的是要產生如下網址:添加額外的數據作爲URL的一部分,而不是作爲參數

http://domain.com/controller/action/id 

這樣想着,我已經在我的RoutesConfig.cs如下配置:

routes.MapRoute(
     name: "AdminMessage", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Admin", action = "Messages", id = UrlParameter.Optional } 
); 

下面是我的控制器看起來像

[HttpGet] 
public ActionResult Messages(string id) 
{ 
    _model = new AdminViewModel(); 
    _userName = Convert.ToString(HttpContext.User.Identity.Name); 
    ViewBag.Page = "Messages"; 
    _model = PrepareLayoutModel(_userName, "Messages"); 
    return View(_model); 
} 

而且我用Url.Action以如下產生url

<a href="@Url.Action("Messages", "Admin", new RouteValueDictionary(new {message.MessageID}))"></a> 

但它總是產生Urlhttp://domainname/controller/[email protected]#123#[email protected],而不是我想要生成它作爲http://domainname/controller/action/[email protected]#123#[email protected]。那麼我能做到這一點的方式是什麼?

回答

1

它需要

@Url.Action("Messages", "Admin", new { ID = message.MessageID }) 

它創建與之相對應的是使用名爲MessageID一個對象的屬性不匹配您的路線您的當前implemenatation與命名ID屬性的對象(其中的路由匹配)所以它的值被添加爲查詢字符串值

+0

完美..愚蠢的錯誤繼續發生.. :( –

+0

我可以再問一個疑問嗎?如何在'Razor視圖'中獲得'id'參數?我嘗試了'Request.QueryString [0]'和'Request.QueryString [「id」]'但它返回的時間都是null。現在最後一部分會被視爲'querystring'嗎?我怎樣才能得到這個? –

+1

因爲你有'url:「{controller}/{action}/{id}」,那麼這個值會添加一個路由值,而不是查詢字符串值。但是因爲方法中的參數是'string id',那麼這個參數就是'message.MessageID'的值(你也可以使用'HttpContext.Current.Request.RequestContext.RouteData.Values [「id 「];'但這是不必要的) –

1

嘗試這樣的:

<a href="@Url.Action("Messages", "Admin", new { id = message.MessageID })"></a> 

甚至更​​好的使用Html.ActionLink助手將生成一個錨標記指向所需的控制器的動作並傳遞id路線參數值:

@Html.ActionLink(
    linkText: "", 
    actionName: "Messages", 
    controllerName: "Admin", 
    routeValues: new { id = message.MessageID }, 
    htmlAttributes: null 
) 

這據說,如果你打算在你的網址的路線部分傳遞特殊字符,你應該be prepared to suffer。在這種情況下,我只是簡單地推薦你使用查詢字符串參數,這些參數可以不受你的痛苦而安全地進行url編碼。所以基本上如果你不控制這個MessageID參數的格式並將其縮小到基本的字母數字字符,那麼你完全不希望它成爲你的路線段的一部分。

+0

感謝您的額外信息@Darin ..我忘了提及我不能使用'@ Html.ActionLink',因爲還有一些其他元素出現在'a'標籤內...非常感謝時間和幫助.. :) –

+0

加20以不同的方式..;) –

+1

我想不出有什麼可行的理由來反對使用標準的HTML助手,例如'Html.ActionLink'。即使你需要在鏈接文本中放置一些你自己的垃圾,你也可以寫一個自定義的HTML幫助器,而不是以HTML DOM標記和服務器端助手之間的這種可怕的意大利麪混合作爲DOM元素的屬性。 –