URL中的MVC4连字符

时间:2012-10-19 15:10:55

标签: asp.net-mvc

所以我试图在我的网址中使用连字符来提高可读性,但到目前为止还没有找到一种方法使其适用于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())
        );

我也这样做了,得到了同样的结果。我搞砸了什么想法?

2 个答案:

答案 0 :(得分:0)

好的我弄清楚我做错了什么,我把它列在了根routebundle.cs文件下,但是我试图让这个工作在一个区域,一旦我将这个代码移动到区域注册文件,它就像魅力。如果有人需要我的完整代码列表,请询问,我会将其全部发布。

答案 1 :(得分:0)

当抓取工具仍然可以访问控制器的下划线版本,从而复制内容时,这有助于SEO。现在正在努力解决这个问题。