【问题标题】:Asp.Net Routing - Display complete URLAsp.Net 路由 - 显示完整的 URL
【发布时间】:2012-10-19 09:00:46
【问题描述】:

我有一个域“http://www.abc.com”。我已经在这个域上部署了一个 ASP.net MVC4 应用程序。我还在 RouteConfig.cs 中配置了默认路由,如下所示

routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "MyApp", action = "Home", id = UrlParameter.Optional }
            );

上述映射确保任何尝试访问“http://www.abc.com”的人都会自动显示“http://www.abc.com/MyApp/Home”页面

一切正常,但浏览器中的地址栏显示“http://www.abc.com”而不是“http://www.abc.com/MyApp/Home”。有什么办法可以强制浏览器显示完整的URL,包括控制器和Action?

【问题讨论】:

    标签: c# asp.net asp.net-mvc-4 asp.net-mvc-routing


    【解决方案1】:

    去掉默认参数就好了,这里已经回答过了:

    How to force MVC to route to Home/Index instead of root?

    【讨论】:

      【解决方案2】:

      一种选择是将您的默认路由设置为新控制器,可能称为BaseController,并带有操作Root

      public class BaseController : Controller
      {
          public ActionResult Root()
          {
              return RedirectToAction("Home","MyApp");
          }
      }
      

      并修改您的 RouteConfig 以指向根请求:

      routes.MapRoute(
          name: "Default",
          url: "{controller}/{action}/{id}",
          defaults: new { controller = "Base", action = "Root", id = UrlParameter.Optional }
      );
      

      【讨论】:

      • 这不公平。因为你需要为一个动作仪式做两次服务器调用?
      • @Laurence - 您的解决方案确实有效,但我也可以看到 VeeKeyBee 的观点。正如 Michael Yoon 所建议的,必须有一个更优雅的解决方案,使用 URL 重写。不过,谢谢你的好建议。如果 URL 重写不符合我的需要,我可能最终会使用此方法
      • @VeeKeyBee 我不确定你所说的不公平是什么意思。这并不理想,并且确实向客户端发送了重定向,但它会给出所需的结果。 user1,我同意 Michael Yoon 的解决方案更优雅,但它会在每个请求(甚至是 /MyApp/Other)上运行,从而导致不必要的字符串比较。如果您需要将用户发送到站点的另一个区域,您还可以向此操作添加其他逻辑。但是不,这不是一个很好的解决方案,Michael Yoon 的解决方案对客户来说是最好的。
      • @Laurence 您的解决方案需要两个服务器请求请求?我就是这么说的。
      • @Laurence - 我选择了您的答案作为最佳答案,因为它不会对 URL 重写将执行的每个请求进行字符串比较。
      【解决方案3】:

      您需要进行某种 url 重写。可能最快的方法是将RewritePath 调用添加到 Global.asax 中的 BeginRequest。在你的情况下,它会是这样的:

      void Application_BeginRequest(Object sender, EventArgs e)
      {
          string originalPath = HttpContext.Current.Request.Path.ToLower();
          if (originalPath == "/") //Or whatever is equal to the blank path
              Context.RewritePath("/MyApp/Home");
      }   
      

      一项改进是从路由表中动态拉取 url 以进行替换。或者你可以使用Microsoft URL Rewrite,但这更复杂 IMO。

      【讨论】:

      • 我需要这样的解决方案。让我检查一下我的 cmets,无论如何感谢您介绍这个。
      • @MichaelYoon - 这似乎接近我所需要的。不过,我仍然无法在我的 MVC 应用程序中使用它。我相信 MVC 没有 Application_BeginRequest 方法,因为 URL 重写可以从 RouteConfig.cs 文件中完成
      • Application_BeginRequest 在 global.asax 中可能默认不存在,但你可以手动添加它,它会被调用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      • 2017-02-13
      • 2010-11-22
      相关资源
      最近更新 更多