【问题标题】:Redirect to internal page in MVC重定向到 MVC 中的内部页面
【发布时间】:2023-03-14 07:51:01
【问题描述】:

我有一个用 ASP.NET MVC 4.5 编写的网站 我有一个名为 Products 的控制器,其中包含有关每个产品的视图。

我希望我们的一种产品在用户访问 www.website.com/ProductName 时重定向到 www.website.com/Products/ProductName。

我现在正在考虑这两种方法:

  • 创建一个名为 ProductName 的控制器并使用 RedirectToRoute()
  • 修改RouteConfig.cs文件并添加一个。

您最好的方法是什么?为什么?还有吗?

【问题讨论】:

  • 选择第二个选项。我没有看到为此添加新控制器/动作然后进行重定向的意义。只需添加带有 Products/{name} 的新路线,您就可以开始了。也许我在这里遗漏了一些东西,但就像我说的,2 号是你的朋友 :)

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


【解决方案1】:

我和@rjovic 在一起,肯定会采用第二种方法并添加一条新路线。

第一种方法需要为每个产品创建一个新的控制器,这似乎违背了良好的设计原则;为什么要为行为相同的多个产品设置一个单独的类?路由正是为这种场景而设计的:将用户友好的 URL 方案映射到应用程序逻辑中的适当处理程序。

在这种情况下,设计路线有两种可能的方法:

  1. 匹配任何 URL,例如 /{ProductName}。问题是这是一个贪心的方案,所以你想把它放在路由列表的末尾附近,这样只有在没有其他方案匹配的情况下才会使用它。
  2. 仅匹配 /{ProductName} 等与实际产品匹配的 URL。因此,您必须预先加载产品名称列表,并构建一个类似于(例如)“[product1|product2|product3]”的约束。

【讨论】:

  • 我会的。在良好的设计原则方面理解它。那么性能呢?我认为路由会影响每个请求和每个请求,同时使用此路由进行分析,而控制器仅影响此 url。你怎么看?
  • @RicardoPolo 不管怎样,MVC 引擎都必须映射相同数量的路由;唯一的区别是它是否必须针对正则表达式字符串或程序集中的控制器进行验证。我看不出一种或另一种会如何导致性能上的显着差异。
【解决方案2】:

看起来你在这里所做的只是一些重定向。您可能想查看使用 IIS Url Rewrite 模块并创建重定向规则,例如

<rewrite>
  <rules>
    <rule name="Redirect to Products/ProductName">
      <match url="^ProductName" />
      <action type="Redirect" url="Products/ProductName" />
    </rule>
  </rules>
</rewrite>

http://learn.iis.net/page.aspx/461/creating-rewrite-rules-for-the-url-rewrite-module/有很多信息

【讨论】:

  • 是否可以使用 Appharbor 或 Azure 之类的云托管?
  • 虽然无法确认,但不知道为什么。
【解决方案3】:

www.website.com/products/productname 会更加 RESTful。从长远来看,当您想添加网站的另一个部分时,将您的产品置于网站的根级别只会自找麻烦。即 www.website.com/about-us - about-us 是产品还是它自己的页面?

创建一个 ProductsController 并有一个默认操作,该操作接受一个作为产品名称的字符串。

【讨论】:

  • 它存在。最终的 Url 是 /product/productName。我只想通过重定向到 /product/productName 轻松访问 ONE 产品
  • 您仍然会遇到与我的回答相同的问题。
猜你喜欢
  • 2013-03-11
  • 1970-01-01
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 2017-03-19
相关资源
最近更新 更多