我需要重建一个网站(旧的他们使用经典的ASP,但他们现在想把它变成MVC 4)并且他们不想改变网址。例如,如果搜索屏幕的网址是blabla.com/search.asp,他们希望保持这样。但是mvc不允许制作像“search.asp”这样的网址。我想保留这样的URL,但渲染搜索视图。我需要一个接一个地做这个还是有一个动态的方式呢?
例如
requested url = "blabla.com/string variable"
if variable.Substring(variable.Length - 4) == ".asp";
return View("variable.Substring(0, (variable.Length - 4))")
注意:语法完全错了,我知道。我只是想解释一下情况......
注2:他们想要这个因为“SEO”的东西。他们不想失去收视率。任何不改变谷歌任何东西的方法,他们都会接受这种方法。
答案 0 :(得分:3)
你需要两件事。
<强> RouteConfig 强>
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "DefaultAsp",
url: "{controller}/{action}.asp/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
处理程序(WebConfig)
(这个需要插入/system.webServer/handlers
<add name="AspFileHandler" path="*.asp" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
这样做你也可以使用.asp使用MVC构建所有URL,这意味着如果你有一个调用另一个View的锚点,那么该视图将具有带.asp后缀的普通mvc URL。
注意强>
这是通用的,您只需要添加此行一次。 Home / Index显示只是默认的Controller和Action。
注2
忘了解释处理程序。
你需要它,因为IIS认为你要求一个ASP文件,它会尝试访问该页面并返回错误,因为它不存在。
使用此处理程序,您允许应用程序自己处理这些页面。
答案 1 :(得分:1)
MVC确实允许您编写包含扩展名的Route,并将其指向特定的Controller:
在RouteConfig.cs中:
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute("Test", "test.asp", new {controller = "Test", action = "test" });
}
然后,在TestController.cs中:
public class TestController : Controller
{
public ActionResult Test()
{
var obj = new Foo();
//Do some processing
return View(obj);
}
}
通过这种方式,您可以毫无问题地访问http://www.foo.com/test.asp
,并维护客户所需的.asp
。