13

我一定很密集。在 StackOverflow 上问了几个问题后,在掌握 ASP.NET MVC 提供的新路由引擎方面,我仍然一头雾水。我想我已经将问题缩小到一个非常简单的问题,如果解决了,可能会让我解决其余的路由问题。所以这里是:

您将如何注册路由以支持用户个人资料的类似 Twitter 的 URL?

www.twitter.com/username

假设还需要支持:

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

  • 网址如:

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

这可能吗?

4

6 回答 6

10

关于什么

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

然后,在 ProfilesController 中,会有一个函数

public ActionResult ShowUser(string userName)
{
...

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

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

routes.MapRoute(
    "Login",
    "Login",
    new { controller = "Security", action = "Login" }
);
于 2008-12-18T08:51:09.490 回答
4

要理解的重要一点是路由按照它们注册的顺序匹配。因此,您需要首先注册最具体的路由,最后注册最一般的路由,否则与一般路由匹配的所有请求永远不会到达更具体的路由。

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

于 2008-12-18T09:01:33.027 回答
0

您可以在家庭控制器中处理它,但控制器方法不会很优雅。我猜这样事情可能会起作用(未经测试):

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

然后在你的 HomeController 中:

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

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

        default: 
            // load user profile view
    }
}
于 2008-12-18T07:51:01.560 回答
0

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

您可以使用以下方法添加 RouteBase 子类:

  routes.Add(new UserRouteBase());

当您注册路线时。

可能值得研究。

于 2008-12-18T09:04:50.867 回答
0

我认为您的问题与我的相似。ASP.NET MVC 路由

这是罗伯特·哈维的回答。

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

)

于 2009-11-06T07:57:18.957 回答
0

这是标准路线注册的另一种方法:

1. 下载RiaLibrary.Web.dll并在你的 ASP.NET MVC 网站项目中引用它

2. 使用 [Url] 属性装饰控制器方法:

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();
}
于 2010-02-03T23:26:38.173 回答