0
我想要做的就像Facebook個人資料頁面(facebook.com/username),我想要做同樣的事情www.myapplication/username,是否有路由方法 ??如何在同一個控制器上進行多路由
我想要做的就像Facebook個人資料頁面(facebook.com/username),我想要做同樣的事情www.myapplication/username,是否有路由方法 ??如何在同一個控制器上進行多路由
要路由到配置文件頁面,您需要一個RouteConstraint路由來檢查用戶名的有效性。您的路線必須是第一條路線,並在Global.asax.cs中的RegisterRoutes應該是這樣的:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Profiles", // Route name
"{username}", // URL
new { controller = "Profile", action = "Index" }, // Parameters
new { username = new MustBeUsername() }
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
然後,你必須創建一個RouteConstraint類會檢查你的數據庫,以確認提交的用戶名是有效的:
using System;
using System.Web;
using System.Web.Routing;
namespace ExampleApp.Extensions
{
public class MustBeUsername : IRouteConstraint
{
public MustBeUsername() { }
private DbContext _db = new DbContext();
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
return (_db.Users.Where(u => u.Username == values[parameterName].ToString()).Count() > 0);
}
}
}
counsellorben
謝謝您的答覆,但如果我想你的代碼,但有一些修改。我得到我的用戶通過會話,所以我有一個異常(空指針),當它第一次加載,如果我把如果條件它會跳過它不會再次進入它作爲global.asax再次調用一次,請建議 –
如果有人正在訪問配置文件,它通常不是創建配置文件的用戶,因此您的Sessoin不會包含正確的信息來驗證您的路由。檢查路線有效性的唯一方法是通過用戶數據庫。 – counsellorben
是的,你是正確的在Facebook上,但我想推特,如果你點擊配置文件,你會得到這個鏈接http://twitter.com/#!/YourUserName –