自定义地图路由在asp.net mvc中无法工作

4

我有一个自定义的MVC路由,但它不起作用。如果我在主页路由之前定义路由,则可以工作,否则就不行。

这段代码无法正常运行。

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

       routes.MapRoute(
          "Citysearch",
         "{state}",
         new { controller = "Dashboard", action = "GetDynamicContent" }
       );

当我先定义citysearch时,它会像这样工作。
routes.MapRoute(
              "Citysearch",
             "{state}",
             new { controller = "Dashboard", action = "GetDynamicContent" }
           );

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

还有一个问题是这是城市搜索的URL http://localhost:51381/dynamic-contentdynamic-content是我的状态参数。它会调用我的 Dashboard/GetDynamicContent。但问题在于当应用程序在登录后运行时,URL为 http://localhost:51381/Home,它总是调用 Dashboard/GetDynamicContent,请问如何解决这个问题,请帮助我。


你能解释一下为什么需要自定义路由吗?在你的Dashboard控制器中,可以将Action设置为GetDynamicContent(string state)。 - Anupam Singh
有一个网格。当我点击这个锚点时,会出现自定义路由。这意味着我想在该锚点上打开新页面。锚点名称是参数。 - Arsalan Qaiser
3个回答

4

路由规则是从上到下读取的。因此,在路由时将使用第一个匹配的路由规则。

尝试一下

routes.MapRoute(
    "Home",
    "Home/{action}",
    new { controller = "Home", action = "index" }
);

routes.MapRoute(
    "Citysearch",
    "DynamicContent/{state}",
    new { controller = "Dashboard", action = "GetDynamicContent" }
);

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

那么我们为自定义路由要做什么呢? - Arsalan Qaiser
始终将自定义路由放在顶部。 - kgbph
但是另一个问题是它将我的控制器名称视为参数...我该怎么解决这个问题呢? - Arsalan Qaiser
在您的CitySearch路由中添加一个URL参数。类似于 url: "foobar/{state}", - kgbph
是的。您可能需要定义另一个路由来覆盖此行为。@Karan 是正确的。 - kgbph
显示剩余5条评论

1
您需要在URL中使用一些固定部分,如下所示DynamicContent/,以解决您面临的问题。您的URL应该像这样http://localhost:51381/DynamicContent/dynamic-content
routes.MapRoute(
    "Citysearch",
    "DynamicContent/{state}",
    new { controller = "Dashboard", action = "GetDynamicContent" }
);

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

我可以不使用任何注入器来完成这个吗? - Arsalan Qaiser
不行。因为如果您没有注入任何内容,那么如果您尝试访问url http://localhost:51381/Home,则Home将被视为{state}的值,并且它将重定向到Citysearch路由。 - Karan

0

我想分享一下我的经验,关于“自定义地图路由无法正常工作”的问题。

我的观察是:当使用href="redirected page"重定向页面时,自定义URL路由无法正常工作。但是,当我使用@Url.Action()进行重定向时,自定义路由开始正常工作。

以下是我的初始代码(部分代码):

return '<a href="/Home/AuthorityForm?formid=' + '@ViewBag.formid' + "&SubmittedFormId=" + full.ConsentId + """ + 'target="_blank">ViewForm';

我将其更改为:

var link = '@Url.Action("AuthorityForm", "Home", new { formid = ViewBag.formid, SubmittedFormId = "-1" })'; link = link.replace("-1", full.ConsentId); return 'ViewForm'

希望这能对某些人有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接