0

我正在使用 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);
            }
        }
4

3 回答 3

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

希望这可以在某个地方对您有所帮助...

于 2013-06-11T13:50:01.880 回答
1

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

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

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

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

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

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

routes.MapRoute(name: "routeName",
url: "mycontroller/{action}/{id}/{countryid}",
defaults: new { controller = "mycontroller",... }...
于 2013-06-11T13:43:46.290 回答
0

我认为 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-06-11T15:23:03.530 回答