2016-08-18 47 views
0

我有兩個問題關於MVC 5.如何重寫MVC 5路線?


生成路線這是例如:

routes.MapRoute(
     name: "ActionSite", 
     url: "{userName}/sites/{action}/{localSiteName}", 
     defaults: new { controller = "Site" } 
); 

@Url.RouteUrl("ActionSite", new { action="Edit", siteOrder = site.Order, localSiteName = site.LocalName, userName = ViewBag.UserName })

生成下一個地址: https://localhost:44344/TestUser/sites/Edit/Site2?siteOrder=1


1)如何隱藏變量?我想隱藏:?siteOrder=1

2)TestUseruserName。此時我手動設置了所有[Authorize]動作。我能用一些特殊的方法做一次嗎?

回答

1

關於第一個問題,RouteUrl假定您要在GET方法中使用該URL,並且在使用GET動詞時,必須將查詢字符串附加到該URL。 siteOrder必須處於查詢狀態,因爲您沒有將其放入URL模板中。任何額外的參數進入查詢字符串。

這裏的解決方案是使用POST而不是GET。不利的一面是會從客戶端丟失簡單的GET調用(錨點)。你必須使用@ Html.BeginForm而不是@ Html.ActionLink。

第二個問題還不清楚,如果您生成的URL如https://localhost:44344/TestUser/sites/Edit/Site2?siteOrder=1那麼您將獲得用戶名錶單URL。 例如:這裏

public ActionResult Edit(string userName, string localSiteName){ } 

用戶名會「爲TestUser」,你必須檢查認證,如果用戶名是一樣的User.Identity.GetUserName() 或者你可以寫AuthenticationFilter爲你做認證工作。

但是,如果你的意思是Url.RouteUrl根據User.Identity自動填寫userName屬性的方式,我認爲答案是否定的。你必須在ActionFilters或行動某處獲取的用戶名,或者如果你正在使用ASP.Identity那麼你已經擁有的用戶名一路下跌到視圖,只是你需要調用

@User.Identity.GetUserName() 
在您查看

或控制器來獲取它。