繁体   English   中英

asp.net mvc的多个参数动作,路由问题

[英]asp.net mvc multiple parameters to an action, routing problem

我的问题是我给我的动作3个参数(类别,城市,页面),其中一些可能是null因为我需要进行3次过滤:

  • 一个按类别(category != null && city == null)
  • 一个按城市(category == null && city != null)
  • 一个由他们两个(category != null && city != null)

我的问题是在路由上。 (category != null && city == null)它不起作用。 它从我的动作空值给出类别参数,我的城市参数接收类别的值。

我的Global.asax:

routes.MapRoute(
            "ListByCity",
            "Advertisers/{city}/{page}",
            new { controller = "Advertisers", action = "List"  }
            );

        routes.MapRoute(
            "ListByCategory",
            "Advertisers/{category}/{page}",
            new { controller = "Advertisers", action = "List" }
            );

        routes.MapRoute(
            "List",
            "Advertisers/{category}/{city}/{page}",
            new { controller = "Advertisers", action = "List" }
            );

请帮我。

以相反的方式思考问题。 如果您有URL http:// YourServer / Advertisers / Text您如何知道该文本是类别还是城市? 您可以使用正则表达式解决匹配问题,但城市和类别都是字符串,因此您无法告知路由系统要匹配哪个。 您将不得不区分它们。 也许创建一个匹配/ Advertisers / Categories / {category}和其他匹配/ Advertisers / Cities / {city}的路线。

这对我来说更像是三个独立的行为:

/Advertisers/List/{category}/{city}/{page}
/Advertisers/ListByCity/{city}/{page}
/Advertisers/ListByCategory/{category}/{page}

这些都可以在您的控制器中调用通用方法来为列表视图准备模型。

编辑:

或者你需要添加一个名为“all”的类别和一个名为“all”的城市,然后你可以只走一条路线:

/Advertisers/List/{category}/{city}/{page}

最好使用查询字符串。

请参考https://stackoverflow.com/questions/4....。

它也有很多好的建议。

我同意@MCL的编辑。.我认为您也可以采取这种方法而无需采取任何措施。

/Advertisers/All/NewYork/1
/Advertisers/SomeCategory/NewYork/2

您可以按照以下方式设置路线:

routes.MapRoute(
        "List",
        "Advertisers/{category}/{city}/{page}",
        new { controller = "Advertisers", action = "List" });

你的行动会看起来像这样:

public ActionResult List ( string category, string city, int page ) { .. }

在这种情况下,我也不同意查询字符串。 它的确很容易,但是我觉得这个URI模式将成为您应用程序的核心部分,而从长远来看,如果不为其设置适当的路由系统,将会阻碍您的工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM