1

所以我试图在我的 URL 中使用连字符来提高可读性,但到目前为止还没有找到一种方法让它与 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>

现在我有两种方式的链接,一种使用下划线,另一种使用连字符。根据我所阅读的有关为此目的找到的代码,两个链接都应打开“Forgot_Login_Info”视图,而不是“Forgot-Login-Info”视图。但是我得到的是第二个链接工作正常,并且操作名称与视图文件名称匹配。但是当我点击第一个链接时,我得到一个 404 错误,因为系统找不到“Forgot-Login-Info”视图文件,即使我已经手动创建了一个具有该名称的文件进行测试。

还有一点需要注意,我的 routeconfig 文件中的代码,在我发现的答案中,我建议我注释掉默认路由代码行,然后离开:

routes.Add(
        new Route("{controller}/{action}/{id}",
        new RouteValueDictionary(
            new { controller = "Default", action = "Index", id = UrlParameter.Optional }),
            new HyphenatedRouteHandler())
        );

我也这样做了,得到了同样的结果。有什么想法让我把事情搞砸了吗?

4

2 回答 2

0

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

于 2012-10-24T16:02:52.437 回答
0

当爬虫仍然可以访问控制器的下划线版本,从而复制内容时,这如何帮助 SEO。现在正在为此苦苦挣扎。

于 2013-05-20T15:56:23.957 回答