【问题标题】:ASP.NET MVC SEO URLASP.NET MVC 搜索引擎优化 URL
【发布时间】:2009-07-02 06:06:52
【问题描述】:

我的目标是让 url 路由如下:

http://www.abc.com/this-is-peter-page

http://www.abc.com/this-is-john-page

在不将控制器名称和函数名称放在上面的 url 中的情况下,实现此目的的最简单方法是什么?如果上面的页面没有找到,我应该重定向到 404 页面。

插件 1:this-is-peter-page 和 this-is-john-page 不是静态内容,而是来自数据库。

【问题讨论】:

  • “this-is-peter-page”是静态页面还是动态页面,其中“this-is-peter-page”将是数据库中的一个字段?

标签: asp.net asp.net-mvc seo


【解决方案1】:

类似于 KingNestor 的实现,您也可以执行以下操作来简化您的工作:

1) 编写模型

public class MyUser{public String UserName{get; set;}}

2) 将路由添加到全局 asax

routes.MapRoute(
   "NameRouting",
   "{name}",
   new { controller = "PersonalPage", action = "Index", username="name" });

3) 滚动您自己的从 IModelBinder 派生的自定义模型绑定器

public class CustomBinder : IModelBinder
    {
       public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
       {
          var request = controllerContext.HttpContext.Request;
          var username = getUserNameFromDashedString(request["username"]);
          MyUser user = new MyUser(username);

          return user;
       }
    }

4) 在你的行动中:

public ActionResult Index([ModelBinder(typeof(CustomBinder))] MyUser usr)
{
    ViewData["Welcome"] = "Viewing " + usr.Username;
    return View();
}

【讨论】:

  • 感谢 Zhaph 重新安排步骤 3 和步骤 4
  • 我发现 bindingContext 不包含 HttpContext
【解决方案2】:

我个人不会建议这样的路线,但如果它满足您的需求,您需要执行以下操作:

在您的 Global.asax 文件中有以下路由:

    routes.MapRoute(
       "NameRouting",
       "{name}",
       new { controller = "PersonalPage", action = "routeByName" });

然后,在您的“PersonalPageController”中,有以下方法:

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult routeByName(string name)
    {
         switch (name)
         {
             case "this-is-peter-page": return View("PeterView");
             case "this-is-john-page": return View("JohnView");
             case Default: return View("NotFound");
         }
    }

确保您的 Views/PersonalPage/ 中有适当的视图:“PeterView”、“JohnView”和“NotFound”。

【讨论】:

  • 您可以将其与路由约束结合起来,以防止“不需要的”请求转到该控制器。 (我假设你还需要一些其他控制器)
  • 如何防止“不需要的”请求?
  • @Ervin Ter,您可以提供将这条路线限制为特定正则表达式的路线约束。
  • @Simucal,我明白了。从来不知道我们可以在路由上植入正则表达式。
【解决方案3】:

我不认为这是可以做到的。 AFAIK ASP.NET MVC 通过字符“/”识别路由参数。

另一方面,您的格式是“{controller}-is-{id}-{action}”——因此无法将控制器与 id 和操作区分开来。

我认为使用“/”字符不会影响或降低 SEO;它只会影响 URL 的人类可读性和保留。

无论如何,以下 URL 是可能的:http://www.abc.com/this-is-the-page-of/Peter 通过在 Global.asax RegisterRoutes 方法中添加另一个路由:

        routes.MapRoute(
            "AnotherRoute",
            "this-is-the-page-of/{id}",
            new { controller = "PersonalPage", action = "Details", id = "" }
        );

...假设PersonalPageController 实现了指向所需页面的Details ActionResult 方法。

【讨论】:

    猜你喜欢
    • 2012-03-09
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多