ASP.NET MVC - MapRoute和routes.Add的区别(以及404错误)

20

我刚开始学习ASP.NET MVC。

MapRoute和routes.Add之间有什么区别? 我应该只使用MapRoute吗?我可以映射多个路由吗?哪些“映射”优先...你最先调用的还是最后调用的?

我想能够像StackOverflow一样为用户提供类似的功能。 但我希望URL符合以下模式:
"User/{domain}/{username}"被路由到UserController

对于所有其他请求,都按照典型的ASP.NET MVC路由处理。例如:

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

更新:
当使用以下URL时:http://localhost:3962/User/MYDOMAIN/BTYNDALL
我遇到了这个错误:HTTP 404。您要查找的资源(或其某个依赖项)可能已被删除,名称已更改或暂时不可用。

这是我的代码:

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

        routes.MapRoute(
            "User",                                                     
            "User/{domain}/{username}",                           
            new { controller = "User", action = "Index" }      
        );

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

    }

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

5
你对这个问题的更新实际上是一个不同的问题……你确定要将它们混在一起吗? - dso
你能把User控制器中Index方法的代码粘贴过来吗? - JMS
DSO,也许吧。我对路由工作方式的假设是正确的。首先设置的路由具有优先权,Brannon已经确认了这一点。但是我遇到了奇怪的404错误。也许其他用户在他们对路由优先级有疑问的同时也会遇到这个问题。 - BuddyJoe
JMs,它是默认设置。现在,视图也是默认设置。代码:public class UserController:Controller{ public ActionResult Index(){ return View(); }} - BuddyJoe
3个回答

37

MapRoute() 是对 Routes.Add() 的扩展方法。除非您需要执行比其允许的更复杂的操作,否则请使用 MapRoute()

路由将按照定义的顺序进行评估,因此首先调用的路由将首先被处理。


这正是我所想的。而且我的第一个路由完全被忽略了。请查看问题更新。 - BuddyJoe
这是原问题的正确答案,也与标题相符(因此有助于在SO上搜索“MapRoute vs Add”的人)。@BuddyJoe,请考虑将其标记为答案。 - tsemer

9

您的用户控制器应该具备以下特点:

public class UserController : Controller {
    public ActionResult Index(string domain, string username) { return View(); }
}

用户控制器的Index方法中的两个变量是从路由中获取的。

等一下...不对,我打错了。谢谢JMs。 - BuddyJoe

4

使用!

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

        routes.MapRoute(
            "User",                                                     
            "User/{domain}/{username}",                           
            new { controller = "User", action = "Index", username= UrlParameter.Optional }      
        );

       }

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接