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 –