旧 aspx Url 的 Asp.net MVC 路由

Lob*_*nts 5 c# asp.net asp.net-mvc redirect

我们曾经有一些网络表单设置允许我们编辑工作。外部应用程序将使用如下 URL 访问它们:

http://server/EditJob.aspx?JobID=1235
Run Code Online (Sandbox Code Playgroud)

用 MVC 替换 Web 表单后,新 URL 为

http://server/MVC/Jobs/Edit/1235 
Run Code Online (Sandbox Code Playgroud)

我希望将之前的 URL 的调用路由到新的 URl,因为无法更改客户端。我怎样才能实现这个目标?

我试过:

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapRoute(name: "Job Link", url: "EditJob.aspx?JobID ={JobID}", defaults: new { area = "MVC", controller = "Jobs", action = "Edit" });

        routes.MapRoute(name: "Default", url: "{controller}/{action}/{id}", defaults: new { area = "MVC", controller = "Jobs", action = "Index", id = UrlParameter.Optional });
    }
Run Code Online (Sandbox Code Playgroud)

但这会给出 (System.ArgumentException: '路由 URL 不能以 '/' 或 '~' 字符开头,并且不能包含 '?' 字符。'

那么,我可以使用路由来做到这一点,还是应该重新创建旧的 Web 表单作为到新页面的重定向。

谢谢

更新

感谢所有聪明的人们,我发现了 IIS URL 重写的奇妙世界,它似乎正是我所需要的。

我现在有了这条规则,它接近我想要的:

   <rewrite>
  <rules>
    <rule name="Jobs page redirect" stopProcessing="true">
      <match url="EditJob.aspx" />
      <conditions>
        <add input="{QUERY_STRING}" pattern="JobID=(\d+)" />
      </conditions>
      <action type="Redirect" redirectType="" url="MVC/Jobs/Edit/{C:1}" appendQueryString="false" />
    </rule>
  </rules>
</rewrite>
Run Code Online (Sandbox Code Playgroud)

但这会重定向到:

 /MVC/Jobs/Edit/1235?JobID=1235
Run Code Online (Sandbox Code Playgroud)

看来appendQueryString =“ false”不起作用或者我错过了什么?

Tim*_*Tim 2

如果可以的话,我会使用 IIS 重写模块来完成此操作。这样,您就可以将旧 URL 的任何逻辑保留在新应用程序之外,并且如果您需要调整规则,只需调整 web.config 文件即可,而不必重新编译站点。

如果您的服务器尚未安装该模块,您可以从此页面上的链接获取它: https: //learn.microsoft.com/en-us/iis/extensions/url-rewrite-module/using-the -url-rewrite-module(您还可以使用 IIS Web 平台安装程序)。

您应该创建一个正则表达式规则来将旧 URL 重定向到新 URL。如果需要,您还可以轻松地为任何其他旧版 URL 添加规则:)