如何在MVC 3中映射像(site.com/username)这样的Route

时间:2011-07-02 03:32:10

标签: asp.net-mvc-3 routes maproute

我想要映射这样的路线:

  

mysite.com/username

ASP.NET MVC 3应用程序中的

;我该怎么办呢? 感谢所有人,问候

2 个答案:

答案 0 :(得分:2)

也许在最开始时添加自定义路由,它将从System.Web.Routing.Route继承,并覆盖方法

protected virtual bool ProcessConstraint(HttpContextBase httpContext, object constraint, 
   string parameterName, RouteValueDictionary values, RouteDirection routeDirection)

您将使用索引列检入数据库。

只需添加一些不可为空的约束对象,如

Constraints = new { username = "*" }

以便路由对象处理约束。

在点击数据库之前,可以进行一些启发式判断是否可以是用户名。记住你不能让用户与控制器相同(当有默认动作时),所以你想以某种方式限制它。注意,如果这不会影响年度表现,但是你可能在斜线后没有很多具有单一价值的路线。

这就是你如何做到的。

public class UserRoute : Route
{
    public UserRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler routeHandler)
        : base(url, defaults, constraints, routeHandler)
    {
    }

    protected override bool ProcessConstraint(HttpContextBase httpContext, object constraint, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        if (routeDirection == RouteDirection.UrlGeneration)
            return true;

        object value;
        values.TryGetValue(parameterName, out value);
        string input = Convert.ToString(value, CultureInfo.InvariantCulture);
        // check db
        if (!CheckHeuristicIfCanBeUserName(input))
        {
            return false;
        }

        // check in db if exists, 
        // if yes then return true
        // if not return false - so that processing of routing goes further
        return new[] {"Javad_Amiry", "llapinski"}.Contains(input);
    }

    private bool CheckHeuristicIfCanBeUserName(string input)
    {
        return !string.IsNullOrEmpty(input);
    }
}

这在开始时添加。

routes.Add(new UserRoute("{username}", 
            new RouteValueDictionary(){ {"controller", "Home"}, {"action", "About"}}, 
            new RouteValueDictionary(){ { "username", "*" }}, new MvcRouteHandler()));

以两种方式为我工作,产生和接受。

答案 1 :(得分:1)

也许是这样的?

routes.MapRoute(
    "Profile",
    "{username}",
    new { controller = "Profile", action = "View" }
);

你的控制器是

public class ProfileController : Controller {

    public ActionResult View(string username) {
       // ...
    }

}