【问题标题】:ASP.NET MVC routing without unnecessary text没有不必要文本的 ASP.NET MVC 路由
【发布时间】:2016-01-30 01:10:56
【问题描述】:

我的 MVC 有问题。像 URL 一样思考。

domain.com/product/any-product/1

domain.com/category/any-category/1

我可以这样更改网址吗?:

domain.com/any-product/1

domain.com/any-category/1

我也可以删除id吗?

context.MapRoute(
    name: "category",
    url: "category/{category_name}/{category_id}",
    defaults: new
    {
        controller = "Cateogory",
        action = "Index",
        Area = "Shop"
    }
);

context.MapRoute(
    name: "product_detail",
    url: "product/{category}/{product_name}/{product_id}",
    defaults: new
    {
        controller = "Product",
        action = "ProductDetail",
        Area = "Shop",
        product_name = UrlParameter.Optional,
        product_id = UrlParameter.Optional
    }
);

【问题讨论】:

  • 可能重复。 Check this out
  • 不,我明白了。不完全一样。

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


【解决方案1】:

不,你不能完全那样做,但你可以更接近。想一想你说你想要什么:

/any-product/ => ProductController
/any-category/ => CategoryController

现在,从逻辑上讲,MVC 应该如何区分哪个 URL 指的是产品,哪个指的是类别?

可以执行以下操作:

/any-category/ => CategoryController
/any-category/any-product/ = > ProductController

现在,有一些方法可以让 MVC 确定 URL 是否不同。如果路径的类别部分后面有东西,那么它就是产品。

至于删除 id 部分,这取决于。首先,id 的要点是您需要某种唯一标识符来存储应该加载的记录。如果“any-product”是一个可以唯一标识记录的字符串(您在数据库中有具有该值的列并且只有一个具有该值),那么您可以使用该字符串来查找实体。那么,不,您不再需要 URL 的 id 部分。但是,如果字符串不是唯一的或与数据库中的数据不对应,那么您需要 id 来定位记录,并且它不能被删除。

【讨论】:

  • 其实可以的。但是你必须通过拦截控制器来处理事情。 /any-product/ => InterceptController => ProductController /any-category/ => InterceptController => CategoryController 拦截控制器将分析来自 URL 的值并确定指令是产品还是类别,然后可以执行 RedirectToRoute 或 RedirectToAction 调用以最终处理请求。显然,您不能拥有同名的产品和类别。然而,这往往会使事情变得混乱,但 SEO 明智。
  • 重定向只会反过来产生同样的问题;您仍然需要为每种类型的事物设置单独的 URL 结构,但现在您只需一个中间步骤即可到达那里。 OP 可以按照您的建议进行操作,然后仅有条件地返回不同的视图。这将允许它们共享相同的 URL 结构,但您最终会得到一个非常繁重且复杂的操作方法。此外,可能存在您根本无法区分的情况。如果一个类别和一个产品有相同的 slug 怎么办?你很无聊。
  • 是的,我同意。拥有这样一个统一的 url 不是一个明智的情况。这也是为什么我说你不能有同名的产品和类别。对于我们的 CMS,我使用 /cat/somecatname/othercatname 等结构和 /p/someproduct 作为产品。这样你就可以路由出 /cat 和 /p 并将它们发送到适当的控制器。仅仅因为你可以做某事并不意味着你应该去做。我只是提供了一个选项供考虑,以防它适合场景。
猜你喜欢
  • 2019-05-10
  • 1970-01-01
  • 2021-11-22
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多