C# asp.net mvc将多个参数用于一个操作、路由问题

C# asp.net mvc将多个参数用于一个操作、路由问题,c#,asp.net-mvc,C#,Asp.net Mvc,我的问题是,我为我的操作提供了3个参数(类别、城市、页面),其中一些参数可能为空,因为我需要进行3次筛选: 一个按类别(类别!=null和城市==null) 一个城市(类别==null和城市!=null) 一个接一个(category!=null和&city!=null) 我的问题是路由问题。 当(category!=null&&city==null)不起作用时。它从my action null值提供给category参数,my city参数接收类别的值 My Global.asax: ro

我的问题是,我为我的操作提供了3个参数(类别、城市、页面),其中一些参数可能为空,因为我需要进行3次筛选:

  • 一个按类别
    (类别!=null和城市==null)
  • 一个城市
    (类别==null和城市!=null)
  • 一个接一个
    (category!=null和&city!=null)
我的问题是路由问题。 当
(category!=null&&city==null)
不起作用时。它从my action null值提供给category参数,my city参数接收类别的值

My 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,您如何知道该文本是类别还是城市? 您可以使用正则表达式解决匹配问题,但城市和类别都是字符串,因此您无法告诉路由系统匹配哪一个。
你得把他们区分开来。可能会创建一条匹配/advisors/Categories/{categority}的路线,以及其他匹配/advisors/Cities/{city}的路线

在我看来,这更像是三个独立的动作:

/Advertisers/List/{category}/{city}/{page}
/Advertisers/ListByCity/{city}/{page}
/Advertisers/ListByCategory/{category}/{page}
这些都可以调用控制器中的公共方法来为列表视图准备模型

编辑:

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

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

最好使用querystring

请参阅


它也有很多好的建议。

我同意@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模式将是你应用程序的核心部分,如果不设置适当的路由系统,从长远来看会妨碍你。

使用查询字符串代替标题我同意你的看法,但我不需要在url上输入我的操作名称。为什么不呢?这是默认的操作方式:
{controller}/{action}/{parameter}
。此外,如果不使用查询字符串或在URL中包含搜索类型作为参数,我认为您不可能真正做到这一点。或者更改参数的顺序(将
{page}
移到前面),然后在生成列表之前确定控制器中的参数类型。如果我从数据库中包括我的城市/类别,则使用正则表达式解决匹配问题可能有效。这可能有用。