【问题标题】:Base Controller For ASP.NET MVCASP.NET MVC 的基本控制器
【发布时间】:2010-01-20 07:07:19
【问题描述】:

有没有办法创建一个处理所有路由的基本控制器实现?

IE /home/index 和 /about/index 都指向一个控制器方法并返回视图。

我正在构建的站点是 90% 的静态内容,我不想创建 50 个控制器。

应该没问题吧?

【问题讨论】:

  • 我们能否提供 10 条示例路线的列表,以获取您问题的准确示例。 2 条路线还不够。

标签: asp.net asp.net-mvc routing


【解决方案1】:

请记住,“控制器”和“动作”是路由系统执行动态魔法的关键字。如果您只是将路由中的“控制器”参数替换为其他参数名称,则始终可以使用默认控制器。

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

请注意,每个方法都应处理“whatever”参数。

【讨论】:

  • 事情是 routes.MapRoute( "Default", // 路由名称 "{controller}/{action}/{id}", // 带有参数的 URL new { controller = "Base", action = "Index", id = "" } // 参数默认值 );这些都命中了 BaseController 但像“/site-faq/banking-faq”这样的路由没有被命中
  • 你不能定义更多的路线来捕捉它们吗? /{随便}/{动作}。 /{whatever}/{action}/stuff/{morestuff*}。请记住,您应该将路线从最具体到最不具体。
  • routes.MapRoute("Leaderboard", "site-promotions/site-leader-board", new { controller = "Base", action = "Index" } );.但是当我点击 /site-promotions/site-leader-board 时,它永远不会点击基本控制器的索引方法
  • 路由测试仪有用吗?并说它会击中基础控制器,但不会
【解决方案2】:

我理解您希望让事情保持简单的愿望,但根据我的经验,您总是需要期待一些变化。如果我是你的情况,我会这样做:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return RedirectToAction("Index", new { controller = "Main" });
    }
}

public class AboutController : Controller
{
    public ActionResult Index()
    {
        return RedirectToAction("Index", new { controller = "Main" });
    }
}

public class MainController : Controller
{
    public ActionResult Index()
    {
        // Do something important.
        // Do something else important.
        return View();
    }
}

要创建 AboutController,我只需复制 HomeController 并将类名更改为 AboutController。通过这种方式,您可以将路线维护工作降至最低,集中您想要集中的行为,并且您仍然可以让自己适应不断变化的需求,而无需撤消很多变通方法。如果在一段时间后,您必须更改特定操作的行为,您只需转到该操作并更改代码。

【讨论】:

    【解决方案3】:

    在你的 global.asax 文件中使用正确的路由,你可以做到这一点。但是一段时间后,由于重构或任何原因,您将很难管理网站。这里是学习asp .net mvc中的路由:http://www.asp.net/learn/mvc/#MVC_Routing

    【讨论】:

      【解决方案4】:

      由于您不打算根据 URL 映射到控制器或方法,因此您只需要捕获几个参数,然后对它们进行一些操作。

       routes.MapRoute( 
           "MyNewRoute", 
           "{firstParameter}/{secondParameter}",
           new {controller="Home", action="Index"} 
       ); 
      
       public ActionResult Index(string firstParameter, string SecondParameter)
       {
           if (firstParameter == "Home")
           {
              // Do something
           }
       }
      

      【讨论】:

      • 我认为“-”正在破坏路线
      猜你喜欢
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      相关资源
      最近更新 更多