【问题标题】:ASP.NET MVC routing issueASP.NET MVC 路由问题
【发布时间】:2013-06-07 08:45:24
【问题描述】:

我正在使用 asp.net mvc 4 。我想使用 3-4 路线模式,但我不能。它只适用于一种模式: 这是我的 RouteConfig 文件:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.Add(
        new Route("mycontroller/{action}/{mlid}/{countryid}/{cityid}",
            new RouteValueDictionary(
                new
                { action="myaction",
                    mlid = UrlParameter.Optional,
                    countryid = UrlParameter.Optional,
                    cityid = UrlParameter.Optional,
                }),
                new HyphenatedRouteHandler())
        );
        routes.Add(
        new Route("{controller}/{action}/{id}",
            new RouteValueDictionary(
                new { controller = "start", action = "Index",id = UrlParameter.Optional}),
                new HyphenatedRouteHandler())
        );

我有一个带有 8 个参数的控制器。我想使用第一种模式,但它使用第二种模式。我使用了 Route Debugger,但它对我没有帮助。 请帮忙。

编辑:

我使用此代码进行导航:

<a href="@Url.Action("myaction", "mycontroller", new { mlid = "1" })">test</a>

但它会在地址栏中显示:

http://localhost:12911/mycontroller/myaction?mlid=1

我想展示一下:

http://localhost:12911/mycontroller/myaction/1

编辑:

这是我的课:

public class HyphenatedRouteHandler : MvcRouteHandler
        {
            protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
            {
                if (requestContext.RouteData.DataTokens["area"] != null)
                {
                    requestContext.RouteData.DataTokens["area"] = requestContext.RouteData.Values["area"].ToString().Replace('-', '_');
                }
                requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_");
                requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_");
                return base.GetHttpHandler(requestContext);
            }
        }

【问题讨论】:

  • 您希望您的路线是什么样的?
  • @edhedges :我编辑它。

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


【解决方案1】:

我会使用路由调试器插件来跟踪它。然后更容易看到路线发生了什么。

Scott Hanselman 在他的这篇博文中建议 Glimpse:

http://www.hanselman.com/blog/NuGetPackageOfTheWeek5DebuggingASPNETMVCApplicationsWithGlimpse.aspx

我尝试复制您的解决方案并在我的项目中创建了以下路线:

        routes.Add(
            new Route("office/{action}/{mlid}/{countryid}/{cityid}",
            new RouteValueDictionary(
                new
                {
                    controller = "office",
                    action = "index",
                    mlid = UrlParameter.Optional,
                    countryid = UrlParameter.Optional,
                    cityid = UrlParameter.Optional,
                }),
                new HyphenatedRouteHandler()
            )
        );
        routes.Add(
            new Route("{controller}/{action}/{id}",
                new RouteValueDictionary(
                    new { controller = "Home", action = "Index", id = UrlParameter.Optional }),
                    new HyphenatedRouteHandler()
                    )
        );

也可以使用 MapRoute 添加路由,但是您必须按照以下方式编写才能使用特定的路由处理程序。

        routes.MapRoute(
            name: "RegReq",
            url: "office/{action}/{mlid}",
            defaults: new
            {
                controller = "office",
                action = "index",
                mlid = UrlParameter.Optional
            }).RouteHandler = new HyphenatedRouteHandler();

然后我创建了一个带有可选 mlid 参数的办公室控制器,如下例所示:

    public ActionResult Index(int? mlid)
    {
        return View();
    }

我从未创建视图,而是在此处添加了一个断点,以查看 mlid 确实获得了我发送的 id。

然后我在主控制器的索引视图中添加了以下链接:

    <a href="@Url.Action("index", "office", new { mlid = "3" })">test</a>

当我浏览测试链接时,我得到以下 URL:

http://localhost:52788/office/index/3

希望这对您有所帮助...

【讨论】:

  • 我使用了 Route Debugger 。但我没有帮助我。 Route Debugger 上一切正常,但浏览时出现问题。
  • 好的。我会尝试将 controller="mycontroller" 添加到第一条路线下的 RouteValueDictionary 中。那里似乎没有设置任何控制器,因此路由引擎可能会对此感到困惑。
  • 很奇怪!我在 MVC4 中创建了一个测试项目(上面添加了我的行),然后按照您想要的方式创建了链接。我会用我正在使用的代码更新我的建议(在几秒钟内)......
  • 在上面的控制器示例中,我忽略了所有其他可选参数以及其他代码,但这只是为了保持示例简单...
  • 我使用了普通路线:routes.MapRoute( name: "RegReq", url: "pro/index/{mainland}/{country}", defaults: new { controller = "pro", action = "index", mainland = UrlParameter.Optional, country = UrlParameter.Optional });。现在它可以工作了。但我需要 HyphenatedRouteHandler 类!!
【解决方案2】:

第一条路线根本没有指定控制器。 Routing 采用第二条路由并将 'mlid' 视为溢出参数,即:路由定义中未指定路由值。试试这个:

<a href="@Url.Action("myaction", "mycontroller", new { id = 1 })">test</a>

它再次使用第二条路由,但这次参数名称与路由中指定的名称匹配。您可以包含任意数量的参数,只需将它们添加到路由中,即

{controller}/{action}/{id}/{countryname}

这样,您将在控制器的 RouteData 和/或操作参数中拥有“countryname”参数。

要使用第一个路由,假设您要使用名为“mycontroller”的控制器,请尝试将其添加为默认控制器,如下所示:

routes.MapRoute(name: "routeName",
url: "mycontroller/{action}/{id}/{countryid}",
defaults: new { controller = "mycontroller",... }...

【讨论】:

  • 这行得通!但是当我想这样做时: test ,它将如何是吗?
  • 它总是使用第二条路线。我不要这个!我想通过第一条路线使用此链接。
  • 你的意思是我只使用一条路线?
  • 是的,您只使用了第二条默认路由,同时使用 Url.Action 生成链接,您得到了 http://localhost:12911/mycontroller/myaction?mlid=1。它链接到控制器“mycontroller”,动作“myaction”,由于路由没有指定mlid,而是id参数,你把它作为一个查询字符串,而不是漂亮的/1
  • 我有 8 个参数。它应该是类似的:http://localhost:12911/mycontroller/myaction?mlid=1&amp;p1=1&amp;p2=1&amp;p3=1...。并且以这种方式partials不起作用..
【解决方案3】:

我认为 Piotr 想说的是,您需要修改此代码以添加默认控制器,以便:

routes.Add(
    new Route("mycontroller/{action}/{mlid}/{countryid}/{cityid}",
        new RouteValueDictionary(
            new
            {
                action="myaction",
                mlid = UrlParameter.Optional,
                countryid = UrlParameter.Optional,
                cityid = UrlParameter.Optional,
            }),
            new HyphenatedRouteHandler())
    );

变成这样:

routes.Add(
    new Route("mycontroller/{action}/{mlid}/{countryid}/{cityid}",
        new RouteValueDictionary(
            new
            {
                controller="mycontroller",
                action="myaction",
                mlid = UrlParameter.Optional,
                countryid = UrlParameter.Optional,
                cityid = UrlParameter.Optional,
            }),
            new HyphenatedRouteHandler())
    );

虽然如果你需要 10 个参数都是可选的,这可能不是最好的解决方案;无论哪种方式,它都会看起来非常丑陋。

【讨论】:

    猜你喜欢
    • 2013-11-13
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多