【问题标题】:Getting url path from ASP.net MVC route从 ASP.net MVC 路由获取 url 路径
【发布时间】:2012-06-20 11:50:45
【问题描述】:

我有一个如下所示的控制器:

public class PageController : Controller
{
    public ActionResult Render(string url)
    {
        //this is just for testing!
        return Content("url was " + url);
    }
}

我正在尝试将 url 的值传递给控制器​​。例如:
http://www.site.com/products/something/else

会将“products/something/else”传递到我的 PageController 的渲染操作中。

这是因为我们使用“products/something/else”作为数据库中记录的唯一键(旧系统,不要问)

所以,我的查询结果将是这样的:

select * from foo where urlKey = 'products/something/else'

到目前为止,我在 Global.asax 的 RegisterRoutes 部分中有这个:

routes.MapRoute("pages", "{*url}", new { controller = "Page", action = "Render", url="/" });

但这并没有按预期工作......

通过访问 www.site.com/products/something/else,传入控制器的值为“home/index/0”
RegisterRoutes 中定义的唯一路线是问题中描述的路线。

【问题讨论】:

  • 什么没有按预期工作?期望什么?实际结果如何?
  • 编辑回答您的问题
  • 我无法重现您所描述的问题。我创建了一个新的 ASP.NET MVC 应用程序,完全按照您的问题中所示定义了 PageController,完全按照您的问题中所示定义了 RegisterRoutes,当我按下 F5 时,我看到:url was products/something/else。您能否提供有关我们如何重现您的问题的详细说明?
  • 这条路线也适合我。我会在回答问题之前检查一下:(
  • @DarinDimitrov @Mark 对我来说,它吐出url was home/index/0

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


【解决方案1】:

以下类匹配每条路线,但您可以根据需要进行修改。

public class LegacyRoute : RouteBase
{
    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
      RouteData result = null;

      string url = httpContext.Request.RawUrl.Substring(1);

      result = new RouteData(this, new MvcRouteHandler());
      result.Values.Add("controller", "Page");
      result.Values.Add("action", "Render");
      result.Values.Add("url", url);

      return result;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
      return null;
    }
}

在 Global.asax.cs 中

routes.Add(new LegacyRoute());

【讨论】:

    【解决方案2】:

    希望这会有所帮助,我们的一条路线做了类似的事情,代码如下:

       routes.MapRoute(
                name: "Standard",
                url: "{controller}/{action}/{id}",
                defaults: new { id = UrlParameter.Optional, action = ControllersAndActions.TypicalController.IndexAction, page = 1 },
                constraints: new
                {
                    controller = ControllersAndActions.ControllerConstraintExpression
                }
            );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-14
      • 2016-02-22
      • 1970-01-01
      • 2010-11-22
      • 2010-11-13
      相关资源
      最近更新 更多