【问题标题】:How to change url for MVC4 WebSite?如何更改 MVC4 网站的 url?
【发布时间】:2013-03-25 02:29:52
【问题描述】:

我需要更改地址栏上的URL

我查找了URL Rewrite,但据我所知,它适用于这样的请求:

url.com/mypage.aspx?xp=asd&yp=okasd

并将其转换为:

url.com/mypage/asd/okasd

http://www.iis.net/downloads/microsoft/url-rewrite

那不是我的范围。我已经有MVC Routesurl.com/mypage 合作。问题是当我输入URL 时,我被重定向(这是我想要的行为)到url.com/otherpage/actionX?param=value。问题是我仍然希望地址栏显示url.com/mypageURL Rewrite 会为此工作吗? 我问是因为我不知道它是否会起作用,因为它是内部重定向(RedirectToAction)而不是“常规”访问。 如果有人想知道为什么我不能为此制定路线,正如我的问题中所解释的那样,我已经有一条规则用于 url.com/mypage 重定向到决定调用什么操作的“路由器”。

我看到了一些问题,但我认为它们并未涵盖我的具体问题:

MVC3 change the url

C# - How to Rewrite a URL in MVC3

更新

这是我的路线:

routes.MapRoute(
    "Profile", // Route name
    "{urlParam}", // URL with parameters
    new { controller = "Profile", action = "Router" } // Parameter defaults
);

Router 操作中,我根据在urlParam 上完成的一些验证重定向到正确的操作。我需要这种行为,因为每个操作都会返回不同的View

更新了我的标签,因为我现在使用的是 MVC4

谢谢。

【问题讨论】:

  • @ConradClark 这似乎很有趣,我会看看这是否适用于我的情况。谢谢。
  • 它对你有用吗?如果是,请标记答案。

标签: c# asp.net-mvc-4 url-rewriting


【解决方案1】:

我曾经不得不在 Windows 机器上运行一个 php 站点。在它最初运行的 linux 机器上,它定义了一个重写,以使站点仅在一个 php 文件 (index.php) 中处理所有请求。

我已经使用以下参数安装并配置了 URL 重写

Name              : all to index.php
Match URL ------------------------------
 Requested URL    : Matches the Pattern
 Using            : Regular Expressions
 Pattern          : (.*)
 Ignore Case      : Checked
Conditions -----------------------------
 Logical Grouping : Match All
    Input         : {REQUEST_FILENAME}
    Type          : Is Not a File
Action ---------------------------------
 Action Type      : Rewrite
 Action Properties:
   Rewrite Url         : /index.php?$1
   Append Query String : Checked
   Log Rewritten URL   : Checked

这使得所有对站点的请求(除了像 css 和 js 文件这样的文件)都由 index.php 处理

所以url.com/user/1 在服务器端被处理为url.com/index.php?/user/1 因为它适用于服务器端客户端 url 保持不变。

以此为基础,您可以构建重写(而不是重定向)。

【讨论】:

  • 唯一的问题是 MVC 已经使用了这条规则 url.com/Controller/Action/ 并且我已经有一个映射路由来处理 url.com/userInput。但我会实施你的解决方案,看看它是否适用于我的情况,谢谢。
  • 那么,好在 IIS Rewrite 在请求被 asp.net 运行时处理之前就对其进行了修改。所有 asp.net 将看到的是重写的 url。详情请见iis.net/learn/extensions/url-rewrite-module/…
【解决方案2】:

Server.Transfer 正是您所需要的,但这在 MVC 上不可用。

在 MVC 世界中,您可以使用 TransferResult 类 defined in this thread

这样...您将代码添加到处理 urlParam 的 ROUTE 操作中,而不是将用户“重定向”(RedirectToAction)到新的 URL,您只需将他/她“转移”到新的操作方法无需更改 URL。

但是有一个问题(我想,我还没有测试过)...如果那个新页面回发了一些东西...它不会使用您路由器的操作 URL (url.com/mypage),而是真正的 ACTION (url.com/otherpage)

希望对你有帮助。

【讨论】:

  • 我已经按照@Conrad Clark 的建议尝试过这种方法,但效果不佳。
【解决方案3】:

在我看来,您可以尝试以下方法:

  1. 从您的 Action 方法返回 EmptyResult 或 RedirectResult。
  2. 另外,您需要为所需的 URL 设置和构建出站路由。

其次,如果这些都不起作用,处理这种情况的粗略方法是使用 Div 标签并将 Div 的内容替换为 Action 方法发出的任何 HTML。我在这里假设在您的问题上下文中,您可以调用 jquery ajax 调用。

希望对您有所帮助。

【讨论】:

  • 我会在几个小时内试试这个并告诉你。感谢您的回答。
  • 抱歉耽搁了,但不,它没有用。我决定暂时创建一个不同的动作。直到我找到答案。不管怎样,谢谢。
【解决方案4】:

您遇到的问题是您将用户(使用 302 http 代码)重定向到新位置,因此浏览器会重新加载页面。您需要修改路由以直接指向您的控制器。路由注册应该是 routes.MapRoute("specific", "my page", new { controller = "otherpage", action="actions", param="value"})。 这条路线应该先注册

【讨论】:

  • 谢谢,但正如我所说,当访问url.com/mypage 时,我需要访问一个操作,然后该操作将查看它将重定向到哪个操作,您明白吗?谢谢
  • "redirect" 正如我已经说过的,将始终显示一个新的 URL。你可以做什么来拥有相同的 URL,你可以为 url.com/mypage 创建一个视图并在视图内调用 html.RenderAction("NewAction", "NewController") 但你需要确保 ("NewAction", "NewController") 将返回一个局部视图
猜你喜欢
  • 1970-01-01
  • 2017-02-05
  • 2013-10-10
  • 2019-02-09
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
相关资源
最近更新 更多