【问题标题】:asp.net mvc routing - rewrite urlasp.net mvc 路由 - 重写 url
【发布时间】:2010-09-29 08:07:12
【问题描述】:

调试后,我得到了我的 webproject 的以下网址:

http://localhost:54594/Home/Home                  /Home-Controller/Home-Action
http://localhost:54594/AboutUs/AboutUs            /AboutUs-Controller/AboutUs-Action
http://localhost:54594/Products/Products          /Products-Controller/Products-Action

在我的global.asax 我有:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Home", id = UrlParameter.Optional } // Parameter defaults
    );
}

我想这样显示我的网址:

http://localhost:54594/Home          /Home action or controller
http://localhost:54594/AboutUs       /AboutUs action or controller
http://localhost:54594/Products      /Products action or controller

使用Home.aspx 可以正常工作,因为它是我的默认网址,我怎样才能对其余网址做同样的事情?

【问题讨论】:

  • 是 { "Home", "AboutUs", "Products" } 控制器还是操作?
  • a 我有 Home、AboutUs、Products 作为控制器。他们里面有动作 Home、AboutUs、Products Actions。

标签: asp.net-mvc url routing


【解决方案1】:

您可以通过多种方式做到这一点,一种方式是为每个区域设置一个控制器,每个控制器都有一个索引操作。这将在路由配置有限的情况下根据需要创建 URL。

另一种方法是拥有一个控制器和多个动作(每个 Home、AboutUs、Products 一个)并将路由设置为类似这样(未经测试)...

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default", // Route name
        "/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Home", id = UrlParameter.Optional } // Parameter defaults
    );
}

希望这会有所帮助。

编辑

刚刚用以下假设检查了以下代码 -

1 个控制器(HomeController)

在 Global.ascx 中

   public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

    }

在 HomeController 中

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

        return View();
    }

    public ActionResult AboutUs()
    {
        return View();
    }
}

这将允许:

http://localhost:port/

http://localhost:port/index

http://localhost:port/aboutus

【讨论】:

  • 我为每个页面创建了控制器。每个控制器都有动作。但我不明白如何在我的网址中显示一个动作。比如:localhost:34534/AboutUs 等。
  • 如果你有一个控制器和多个操作它很简单(见更新)。如果您有控制器/动作的一对一映射,那么它是可行的。但是,如果您想要多个控制器/动作,那么它会变得很棘手,因为您需要知道动作指的是哪个控制器。这可以通过自定义控制器工厂和某种查找来完成。
【解决方案2】:

我将有一个带有“http://localhost:54594/Home”的“Home”/“Index”操作的“Home”控制器。对于“http://localhost:54594/AboutUs”,我也会使用“Home”控制器和“AboutUs”动作。

对于“http://localhost:54594/Products”,我有它自己的控制器,因为它可能更复杂。默认路由应该可以正常使用。

我会将“/AboutUs”路由到“/Home/AboutUs”操作,如下所示:

routes.MapRoute(
    "AboutUs_Shortcut", "AboutUs", new { controller = "Home", action = "AboutUs" }
);

【讨论】:

  • 这与我想做的完全相反:)
猜你喜欢
  • 2013-01-19
  • 2011-11-11
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 2010-11-13
相关资源
最近更新 更多