私は次のようなルートを取得しようとしています:
{lang:optional} / {controller} / {action} / {id:optional}
この記事の「コントローラー制約」のアイデア:(コントローラー名に対するMVCルーティング制約)では、{lang}値が提示されているかどうかに関係なく、上記のルートは非常にうまく機能します。
ただし、このルートに一致させるには問題があります。
routeName: testRoute
url: {lang:optional}/list/{something:optional}
{controller = "product", action = "index"}
上記のルートでは、{lang}値を提示する必要があります。提示しないと、機能しません。
私はそれを解決するために2つの回避策があります。
最初の方法は、上記の2つのルートを設定することです。
非常に標準的なもの:
routeName: testRoute
url: /list/{something}
{controller = "product", action = "index"}
そして別の非常に標準的なもの:
routeName: testRouteLang
url: {lang:not_optional}/list/{something:optional}
{controller = "product", action = "index", lang="de"}
2つの標準ルートを1つのルートに結合する方法があるかどうか疑問に思っています。
2番目の回避策は、次のようなサブドメイン名を使用することです。
http://example.com/list (default to English)
http://de.example.com/list (de)
しかし、SEOの理由から、私はサブドメインのアイデアが本当に好きではありません(多分私はこの点で間違っています)。
私の目標は、URLのデフォルトの「en-us」を削除することです。私はこれが好き
http://www.example.com/list/something (default as English)
URLに「en-us」を強制したくない
http://www.example.com/en-us/list/something
「lang」は、現在の文化が英語でない場合にのみURLで表示する必要があります。
http://www.example.com/de
http://www.example.com/fr/list/something
ありがとう。
最後に、私は非常に簡単で乾燥した解決策を見つけました。重要なのは、HttpContext.Current.RewritePathを使用してデフォルトの「en」を挿入することですが、この「en」はURLに表示されません。
protected void Application_BeginRequest()
{
var rawUrl = HttpContext.Current.Request.RawUrl;
var segments = HttpContext.Current.Request.Url.Segments;
var segment1 = segments.Count() >= 2 ? segments[1] : string.Empty;
if (IsSomethingThatIWantToHandle("are,you,js,script,css,jpg,png,and,so,on?")
&& !LittleHelper.DoIHaveValidLangAlready(segment1))
{
HttpContext.Current.RewritePath("/en" + rawUrl);
}
}
URLを生成するときに、langがnull / emptyの場合、URLはdouble //になります。余分な「/」を削除するには、ちょっとしたヘルパーが必要です。
ルートを定義するときの秘訣は、エリア名をDataTokenに追加する必要があることです。そうしないと、プロジェクトにエリアが表示されている場合、ビューを正しく見つけることができません。
routes.MapRoute(
"good name",
"{lang}/some-cool-stuff/{id}/{slug}",
defaults: new { area = "bigarea", controller = "bigcontroller", action = "tinyaction",
lang = UrlParameter.Optional, id = UrlParameter.Optional, slug = UrlParameter.Optional }
, constraints: new { lang = new CultureConstraint() }
).DataTokens.Add("area", "bigarea");
CultureConstraintは非常に単純です。有効なカルチャ名であるかどうかを確認するだけです。名前空間の制約は必要ありません。ただし、ルートテーブルが大きくて複雑な場合は、コントローラーの制約、またはアクションの制約が非常に必要です。そうでない場合、ルートの重複が問題になります。
プロジェクトのデフォルトルートは次のとおりです。url: "{lang} / {area} / {controller} / {action} / {id} / {slug}"、
そしてそれは私が望むように美しく動作します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加