2008-12-18 125 views
13

我必须是密集的。在StackOverflow上提出了几个问题之后,在抓住ASP.NET MVC提供的新路由引擎时,我仍然处于亏损状态。我认为我已经将问题简化为一个非常简单的问题,如果解决了问题,可能会让我解决其余的路由问题。所以这里是:ASP.NET MVC路由问题

你将如何注册一个路径来支持用户配置文件的类似Twitter的URL?

www.twitter.com/username

假设需要也支持:

  • 默认{controller}/{action}/{id}路线。

  • 的网址,如:

    www.twitter.com/login
    www.twitter.com/register

这可能吗?

+0

这是一个有用的工具太:http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx – 2008-12-18 07:52:08

+0

嗨凯文,你得到你的答案? – Parminder 2009-07-29 10:33:40

回答

10

什么

routes.MapRoute(
    "Profiles", 
    "{userName}", 
    new { controller = "Profiles", action = "ShowUser" } 
); 

,然后在ProfilesController,会有一个功能

public ActionResult ShowUser(string userName) 
{ 
... 

在该函数中,如果没有找到具有指定userName的用户,则应该重定向到默认的{controller}/{action}/{id}(这里只是{controller})路由。

像www.twitter.com/login这样的网址应在该网址之前注册。

routes.MapRoute(
    "Login", 
    "Login", 
    new { controller = "Security", action = "Login" } 
); 
0

你可以在家庭控制器中处理,但控制器方法不会很优雅。在你的HomeController

routes.MapRoute(
    "Root", 
    "{controller}/{view}", 
    new { controller = "Home", action = "Index", view = "" } 
); 

然后:我猜的东西像威力工作(未测试)

public ActionResult Index(string view) { 
    switch (view) { 
     case "": 
      return View(); 

     case "register": 
      return View("Register"); 

     default: 
      // load user profile view 
    } 
} 
4

重要的是要理解的是,路线匹配的顺序是他们注册。因此,您需要首先注册最具体的路线,最常见的最后一个路线或与所有一般路线匹配的所有请求永远不会到达更具体的路线。

针对您的问题,我会为每个特殊页面注册路由规则,例如用户名规则前的“注册”和“登录”。

0

好吧我还没有正确地尝试过这一点,但是你是否尝试过扩展RouteBase类来处理用户。 RouteBase的文档建议如果GetRouteData方法与当前请求不匹配,它应该返回null。您可以使用它来检查请求是否与您拥有的用户名之一匹配。

可以使用添加RouteBase子类:

routes.Add(new UserRouteBase()); 

当你注册的路由。

可能值得调查。

0

我认为你的问题与我的相似。 ASP.NET MVC Routing

这是什么robert harvey回答。

routes.MapRoute(_ 
    "SearchRoute", _ 
    "{id}", _ 
    New With {.controller = "User", .action = "Profile", .id = ""} _ 

0

这里是一个的标准配置路线注册的另一种方式:

1.下载RiaLibrary.Web.dll并在ASP.NET MVC的网站项目

2引用它。用[Url]属性对Decodeate控制器方法进行解码:

public SiteController : Controller 
{ 
    [Url("")] 
    public ActionResult Home() 
    { 
     return View(); 
    } 

    [Url("about")] 
    public ActionResult AboutUs() 
    { 
     return View(); 
    } 

    [Url("store/{?category}")] 
    public ActionResult Products(string category = null) 
    { 
     return View(); 
    } 
} 

顺便说一句,'?'登录'{?category}'参数意味着它是可选的。您不需要在默认路径明确指定这一点,这就是等于这样的:

routes.MapRoute("Store", "store/{category}", 
new { controller = "Store", action = "Home", category = UrlParameter.Optional }); 

3.更新的Global.asax.cs文件

public class MvcApplication : System.Web.HttpApplication 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoutes(); // This do the trick 
    } 

    protected void Application_Start() 
    { 
     RegisterRoutes(RouteTable.Routes); 
    } 
} 

如何设置默认值,限制?例如:

public SiteController : Controller 
{ 
    [Url("admin/articles/edit/{id}", Constraints = @"id=\d+")] 
    public ActionResult ArticlesEdit(int id) 
    { 
     return View(); 
    } 

    [Url("articles/{category}/{date}_{title}", Constraints = 
     "date=(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])")] 
    public ActionResult Article(string category, DateTime date, string title) 
    { 
     return View(); 
    } 
} 

如何设置排序?例如:

[Url("forums/{?category}", Order = 2)] 
public ActionResult Threads(string category) 
{ 
    return View(); 
} 

[Url("forums/new", Order = 1)] 
public ActionResult NewThread() 
{ 
    return View(); 
}