ASP.NET MVC路由问题

时间:2008-12-18 07:29:05

标签: asp.net-mvc routing

我必须密集。在对StackOverflow提出几个问题后,在掌握ASP.NET MVC提供的新路由引擎时,我仍然感到茫然。我想我已经把问题缩小到一个非常简单的问题,如果解决了,可能会让我解决其余的路由问题。所以这就是:

您如何注册支持用户个人资料的类似Twitter的网址?

  

www.twitter.com/username

假设还需要支持:

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

  • 网址如:

      

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

这可能吗?

6 个答案:

答案 0 :(得分:10)

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

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

public ActionResult ShowUser(string userName)
{
...

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

www.twitter.com/login等网址应该在此之前注册。

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

答案 1 :(得分:4)

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

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

答案 2 :(得分: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
    }
}

答案 3 :(得分:0)

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

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

  routes.Add(new UserRouteBase());

注册路线时。

可能值得调查。

答案 4 :(得分:0)

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

这是robert harvey回答的问题。

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

答案 5 :(得分: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();
}