如何更改MVC4 WebSite的URL?

时间:2013-04-03 12:14:51

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

我需要更改地址栏上的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

感谢。

4 个答案:

答案 0 :(得分:0)

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

我已使用以下参数安装并配置了URL Rewrite

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保持不变。

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

答案 1 :(得分:0)

Server.Transfer正是您所需要的,但在MVC上无法使用。

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

有了这个......你将代码添加到你的ROUTE动作中,它一如既往地处理urlParam而不是“重定向”(RedirectToAction)用户到一个新的URL,你只需将他/她“转移”给一个新的动作方法不改变URL。

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

希望它有所帮助。

答案 2 :(得分:0)

在我看来,你可以试试以下事情:

  1. 从Action方法返回EmptyResult或RedirectResult。
  2. 此外,您需要为所需的URL设置和构建出站路由。
  3. 其次,如果这些不起作用,处理这种情况的粗略方法是使用Div标记并用Action方法发出的任何HTML替换Div的内容。我假设在你的问题上下文中,你可以调用jquery ajax调用。

    希望这有助于。

答案 3 :(得分:-1)

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