1

我正在建立一个网上商店,我正在实施语言选择以及 CMS。我还必须为站点管理员提供能够通过 CMS 编辑页面的方法。

这不存在问题。

问题是我应该如何为这些页面建立我的表格。我已经完成了我的数据库设计,但认为网页没有通过。

对于页面(称为网页)的所有语言和特定于语言或文化的信息(称为 Webpages_local),我已经有以下表格结构。 数据库设计片段

我可以添加或删除哪些属性,以便我可以轻松动态地执行 CRUD 操作?

我正在使用具有以下 url 结构的剃刀语法的MVC4 :

url: "{language}/{controller}/{action}/{id}"

我现在主要担心的是,当访问者按下时,我不确定如何显示页面的特定语言内容,例如,指向“关于”页面的链接。

也许使用 url 的控制器部分并将其保存为我的网页表中的键并对其进行过滤以及选择的语言?

因此,当访问者访问http://example.com/nl/About时,我在 AboutController 中检索“nl”和“about”,当然首先过滤它们,然后通过查询数据库选择正确的 nl ​​内容?

我应该如何从技术上解决这个问题?

4

2 回答 2

0

我会在您的表格中添加一个名为 language 或类似的列,而不是拥有多个表格。

然后您的控制器可以在您的菜单表中找到请求的语言键后获取正确的页面,然后它可以读取您的网页表中的内容。

于 2012-12-26T22:23:22.263 回答
0

我会用它OnActionExecuting来处理检索语言过程,例如:

protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            #region set Language
            var lang = string.Empty;
            if (filterContext.RouteData.Values["lang"] != null && !string.IsNullOrWhiteSpace(filterContext.RouteData.Values["lang"].ToString()))
            {

                // set the culture from the route data (url {lang})
                lang = filterContext.RouteData.Values["lang"].ToString();
                switch (lang)
                {
                    case "es":
                        break;
                    case "en":
                        break;
                    default:
                        lang = "es";//default language
                        filterContext.RouteData.Values["lang"] = lang;
                        filterContext.HttpContext.Response.Redirect("/");
                        break;
                }

            }
            else
            {
                //set default language
                lang = "es";
                filterContext.RouteData.Values["lang"] = lang;
            }

            Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(lang);
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);

            #endregion

            base.OnActionExecuting(filterContext);
        }

然后在您的代码中的任何地方,您只需阅读Thread.CurrentThread.CurrentCulture(这将是您的全局语言指示器)以显示正确的语言。

更新 - 知道我明白你的意思=)

如果页面将被动态创建,那么您将不会有ActionResult每页,您只需要一个 ActionResult,例如:

public ActionResult ShowPage(int id,string slug)
{
   //Use the slug to check for url attacks and ensure 301 redirections to the correct url
   var page = db.Webpages_local.First(p=> p.id == id 
          && p.culture.name == Thread.CurrentThread.CurrentCulture);

   return View(page);
}

出于 SEO 原因,我建议您定义如下路线:

    routes.MapRoute(
       name: "LocalizedPages",
       url: "{lang}/p/{slug}/{id}",
       defaults: new { controller = "Page", action = "Show", id = UrlParameter.Optional },
       constraints: new { lang = @"(es|en|fr|nl)" }
   );

这会给你这样的网址:

/nl/p/about/1 //the p is just an identifier for 'page', to differentiate this routes from others
于 2012-12-27T00:31:26.800 回答