所以我试图在我的网址中使用连字符来提高可读性,但到目前为止还没有找到一种方法使其适用于mvc4。
我将从控制器中的代码开始:
public ViewResult Index()
{
ViewBag.URL = Functions.fetchURL();
return View();
}
[HttpPost]
public ActionResult Index(LogonModel model, string returnUrl)
{
//omitted to save space
return View(model);
}
public ActionResult Forgot_Login_Info()
{
return View();
}
[HttpPost]
public ActionResult Forgot_Login_Info(RetrievePasswordViewModel model)
{
//omitted to save space
return View();
}
所以我使用下划线作为动作的名称,如“Forgot_Login_Info”所示,这也是视图的名称。为了测试,我还手动创建了一个名为“Forgot-Login-Info”的视图
在我的global.asax.cs文件中,我只有路线
RouteConfig.RegisterRoutes(RouteTable.Routes);
这是MVC4的新项目的标准路由线,它连接到“RouteConfig.cs”文件,在这个文件中这里是我的代码,我在本网站的另一个问题中找到了。
public class RouteConfig
{
public class HyphenatedRouteHandler : MvcRouteHandler
{
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-","_");
requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_");
return base.GetHttpHandler(requestContext);
}
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.Add(
new Route("{controller}/{action}/{id}",
new RouteValueDictionary(
new { controller = "Default", action = "Index", id = UrlParameter.Optional }),
new HyphenatedRouteHandler())
);
}
}
最后这里是“索引”视图的代码,这是我有“Forgot_Login_Info”链接的地方。
<div class="centerBlockItem" style="width:450px; text-align:center">
@Html.ActionLink("Forgot Password?", "Forgot-Login-Info")
@Html.ActionLink("Forgot Password?", "Forgot_Login_Info")
</div>
现在我有2种方式的链接,1使用下划线,另一种使用连字符。根据我在为此目的找到的代码中所读到的内容,两个链接都应该打开“Forgot_Login_Info”视图而不是“忘记登录信息”视图。但我得到的是第二个链接工作正常,动作名称与视图文件名称匹配。但是当我点击第一个链接时,我收到404错误,因为系统找不到“忘记登录信息”视图文件,即使我手动创建了一个具有该名称的文件进行测试。
还有一件事需要注意,我的routeconfig文件中的代码,在我找到的答案中建议我注释掉默认的路由代码行,然后离开:
routes.Add(
new Route("{controller}/{action}/{id}",
new RouteValueDictionary(
new { controller = "Default", action = "Index", id = UrlParameter.Optional }),
new HyphenatedRouteHandler())
);
我也这样做了,得到了同样的结果。我搞砸了什么想法?
答案 0 :(得分:0)
好的我弄清楚我做错了什么,我把它列在了根routebundle.cs文件下,但是我试图让这个工作在一个区域,一旦我将这个代码移动到区域注册文件,它就像魅力。如果有人需要我的完整代码列表,请询问,我会将其全部发布。
答案 1 :(得分:0)
当抓取工具仍然可以访问控制器的下划线版本,从而复制内容时,这有助于SEO。现在正在努力解决这个问题。