1

Web ショップを構築しており、言語選択と CMS を実装しています。また、CMS を介してページを編集できる手段をサイトの管理者に提供する必要があります。

そこには問題はありません。

問題は、これらのページのテーブルをどのように作成するかです。データベースのデザインを作成しましたが、Web ページが途切れるとは思いませんでした。

ページ (Webpages と呼ばれる) および言語または文化固有の情報 (Webpages_local と呼ばれる) のすべての言語で等しい情報について、次のテーブル構造が既にあります。 データベース設計のスニペット

CRUD アクションを簡単かつ動的に実行できるようにするには、どの属性を追加または削除すればよいですか?

次のURL構造を持つかみそり構文でMVC4を使用しています:

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

私の主な関心事は、訪問者がページの言語固有のコンテンツ (たとえば、About ページへのリンク) を押したときにページの言語固有のコンテンツを表示する方法がわからないことです。

URL のコントローラー部分を使用して、それをキーとして Web ページ テーブルに保存し、それと選択した言語でフィルター処理することはできますか?

したがって、訪問者がhttp://example.com/nl/Aboutにアクセスすると、 AboutController で「nl」と「about」を取得し、もちろん最初にそれらをフィルタリングしてから、データベースへのクエリで正しい nl コンテンツを選択します?

技術的にはどうすればいいですか?

4

2 に答える 2

0

複数のテーブルを持つ代わりに、language などの列をテーブルに追加します。

次に、コントローラーは、メニュー テーブルで要求された言語キーを見つけた後、適切なページをフェッチし、Web ページ テーブルのコンテンツを読み取ることができます。

于 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(これがグローバル lang インジケーターになります) を読み取って、正しい言語を表示します。

更新 - 私はあなたのポイントを理解していることを知っています =)

ページが動的に作成される場合、ページActionResultごとに作成する必要はありません。次のような ActionResult が 1 つだけ必要です。

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)" }
   );

次のような URL が得られます。

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