2010-04-23 192 views
0

我可以看到一个能够编译这段代码的例子吗?ASP.NET MVC路由

public IEnumerable<RouteBase> Routes 
    { 
     get 
     { 
      return new List<Route>() 
      { 
       new Route(...) 
      } 
     } 
    } 

如果RouteCollection.MapRoute()不存在,您会怎么做?

我想把我的控制器负责映射路由,而不是Global.asax.cs。 public IEnumerable<RouteBase> Routes是我的控制器的成员。如果控制器负责路由,则通过使用中的单独硬编码URL在Global.asax.cs中解耦路由是个坏主意。

在回答哈维先生:

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     RouteTable.Routes.Include(new RootController()); 
    } 
} 

public static class RouteCollectionExtension 
{ 
    public static RouteCollection Include(this RouteCollection routes, IRoutedController controller) 
    { 
     foreach (var route in controller.Routes) 
     { 
      routes.Add(route); 
     } 

     return routes; 
    } 
} 

和:

public class RootController : Controller, IRoutedController 
{ 
    public ActionResult Index() 
    { 
     ViewData["Message"] = "Welcome to ASP.NET MVC!"; 

     return View(); 
    } 

    public IEnumerable<RouteBase> Routes 
    { 
     get 
     { 
      return new List<Route>() 
      { 
       new Route("{controller}/{action}/{id}", ...?!?) 
      }; 
     } 
    } 
} 
+0

这不是鸡和鸡蛋的问题吗?如果控制器方法从不执行(路由引擎执行控制器方法,因此至少需要一条现有路由来执行此操作),它将如何设置路由? – 2010-04-23 05:00:31

+0

也许吧。 :)## – MVCDummy09 2010-04-23 05:09:00

+0

不知道该编辑是否针对我。控制器不负责路由,路由引擎是。我很佩服你的韧性,但你仍然没有解释如何执行控制器方法,所以你可以设置一些路由,如果路由引擎没有预定义的路由,因此无法执行控制器方法。 – 2010-04-23 05:10:07

回答

2

吓到我在这个岗位的一条线是在下列

我想把我的控制器放在 负责映射路线

asp.net mvc背后的想法是明确的关注点。由于控制器不再仅仅是控制而是干涉路线,这将杀死控制器的可测试性。