为什么不将字符串参数路由到某个操作?

时间:2017-06-09 19:12:38

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

在我的MVC5应用程序中,我试图将一个字符串传递给一个动作。

PodcastsController我有一个名为Tagged的行为:

public ActionResult Tagged(string tag)
{
    return View();
}

例如,如果我想将字符串Test传递给Tagged操作,则在网址中显示如下:

/播客/标记/测试

我的路线设置如下:

routes.MapRoute(
       "Podcasts",
       "Podcasts/Tagged/{tag}",
       new { controller = "Podcasts", action = "Tagged", tag = UrlParameter.Optional }
    );

修改我正在调用Tagged这样的操作:

if (!string.IsNullOrEmpty(tagSlug))
{
    return RedirectToAction("Tagged", "Podcasts", new { tag = tagSlug });
}
  

当我在Tagged操作上设置断点时,tag始终为空

谁能看到我做错了什么?

我很确定路线有问题,但我无法弄清楚是什么......

3 个答案:

答案 0 :(得分:1)

您获得null的原因是您实际上没有在代码中传递名为tag的参数:

if (!string.IsNullOrEmpty(tagSlug))
{
    return RedirectToAction("Tagged", "Podcasts", new { tagSlug });
}

当您省略属性名称时,它将采用变量名称,因此您实际上正在传递您的操作不接受的变量tagSlug。试试这个:

if (!string.IsNullOrEmpty(tagSlug))
{
    return RedirectToAction("Tagged", "Podcasts", new { tag = tagSlug });
}

答案 1 :(得分:0)

它一定像这样工作......

然后转到http://localhost:64147/podcast/tagged/hi并将hi作为标记

的值重新显示
public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "MyRoute",
        url: "podcast/tagged/{tag}",
        defaults: new { controller = "Podcasts", action = "Tagged", tag = UrlParameter.Optional }
    );

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

答案 2 :(得分:0)

对不起,我在这里问,但你是否检查过你的路线是否可以覆盖任何其他路线?

路由是按顺序完成的。选择与给定参数对应的第一条路线,如果您首先使用此路线

{controller}/{action}/{id}

然后

Podcasts/Tagged/{tag}

因为选择了第一条路线,您将获得空值

路线顺序实际上很重要