【问题标题】:ASP.NET MVC routing: with querystring to one action, without to anotherASP.NET MVC 路由:查询字符串到一个操作,而不是另一个
【发布时间】:2011-11-15 18:53:17
【问题描述】:

我需要以下路线:

example.com/products
转到产品类别页面(例如汽车、卡车、公共汽车、自行车)
控制器=Products,动作=Categories()

example.com/products?a=1&b=2
转到特定类别中所有产品的索引(例如福特、本田、雪佛兰)
控制器=Products,动作=Index(string a, string b)

路由仅在查询字符串上有所不同,并且 MVC 似乎忽略了“?”之后的任何内容。所以当然只有一条规则会受到打击——第一条。

如何区分两者?

编辑: 换一种说法,我想要两条路线。是否可以在路由中使用查询字符串或者 MVC 是否真的忽略它?有没有办法破解它,或者使用某种自定义路由方案,就像我可以进行自定义绑定和自定义验证一样?

【问题讨论】:

  • 对于这样的 URL,您不需要 - 如果设置了 a & b,您可以返回正确的视图,如果没有设置,则返回索引。为什么不像这样区分 URL:example.com/productsexample.com/products/a/b 换句话说,为什么您希望 ab 成为查询参数而不是 URL 的一部分?如果将它们作为 URL 的一部分,则路由很简单:将复杂的路由(首先需要 ab)和不太复杂的路由放在第二位。
  • 谢谢,但这不是我们正在做的事情,因为您正在对作为资源的路线本身的瞬态数据进行编码;这就是适当格式化数据的查询字符串的目的。就您的第一个建议而言,是的,我们可以将所有内容都放在一个操作方法中,并在其中决定要返回的视图 - 但是我正在做我自己的路由,这看起来很愚蠢,我希望框架能够做到这一点我。
  • stackoverflow上有更多关于这个的讨论。这可能是合适的:stackoverflow.com/questions/968904/…

标签: asp.net-mvc asp.net-mvc-3 query-string asp.net-mvc-routing


【解决方案1】:

引入参数。 ASP.NET MVC 允许您创建“漂亮”的 URL,而这正是您应该在这里做的:

首先,路由映射:

routes.MapRoute(
    "SpecificProducts",
    "products/{a}/{b}",
    new { controller = "products", action = "Categories" }
    );

routes.MapRoute(
    "ProductsIndex",
    "products".
    new { controller = "products", action = "Index" }
    );

然后,控制器动作

public ActionResult Index()
{
}

public ActionResult Categories(string a, string b) //parameters must match route values
{
}

这将允许您使用搜索友好的 URL,并且您不必担心查询字符串参数。

【讨论】:

  • 感谢您的建议。我们仍然可以使用查询字符串参数来做到这一点吗?恕我直言,这是“正确”的做法。路由应该忽略数据的格式。类似的问题我遇到过很多次了,看来MS路由的人在这里设计的不是很好。
  • @mvcstudent:这不是 imo 失败的 ms 设计。只需处理您的操作中可能为 null 的参数,一切正常。仅使用一条路由并将 A 和 B 设置为“可选参数”。
  • @mvcstudent 答案是不使用 QueryString。你不喜欢那个答案,但这就是答案。这不是 MVC 的失败,我不同意您的断言,即使用查询字符串参数是做任何事情的“正确”方式。它不是。 (如果是,那么它将是 The Way 而不是友好的 URL)。现在,我应该说谁是错误的?微软,谁有很多资深程序员设计一个框架?或者以“mvcstudent”作为用户名的人?
  • @George Stocker:撇开可爱的名字不谈,我们在 Web 系统方面拥有丰富的经验。路由和 URL 是指向 content 的资源。查询字符串用于演示。当有大量过滤器、搜索条件、分页参考、页面大小参考等时,“漂亮”方法很快就会失效。如果我不喜欢你的回答,我很抱歉冒犯了你。我想不管对你有用。但我仍然希望有人告诉我 MVC 路由是否可以做我需要的,如问题中所述?
  • 路由旨在从另一个资源中划定一个资源,而正如您所说,QueryString 参数用于表示逻辑*。因此,如果使用相同的 URL,但使用查询字符串参数,您不能期望指向资源的 URL 转到不同的资源。这不是 MVC 的失败,而是我不相信您正确使用了 Querystrings。
猜你喜欢
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
相关资源
最近更新 更多