3

以下のようにglobal.asaxで2つのルートを定義しました

context.MapRoute("HomeRedirect", "",
                            new
                            {
                                controller = "Home",
                                action = "redirect"
                            });

context.MapRoute("UrlResolver", "{culture}/some",
                            new
                            {
                                culture = "en-gb",
                                controller = "someController",
                                action = "someAction"
                            },
                            new
                            {
                                culture = new CultureRouteConstraint()
                            });

上記の定義によると、ユーザーが mysite.com/homeController のリダイレクト アクションを要求したときに、次のように呼び出す必要があります。

public class HomeController : Controller
{
    public ActionResult Redirect()
    {
        return RedirectToRoute("UrlResolver");
    }
}

上記の2番目に定義されたルートにユーザーをリダイレクトしたいので、そのデフォルト値とそれぞれの制約を指定しました。しかし、RedirectToRoute("UrlResolver")順番が変わると、2 番目のルートで routeConstraints にデフォルト値が渡されず、表示されNo route in the route table matches the supplied valuesます。

アップデート

私のCultureRouteConstraint:

public class CultureRouteConstraint : IRouteConstraint
{
    bool IRouteConstraint.Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        try
        {
            var parameter = values[parameterName] as string;
            return (someCondition(parameter));
        }
        catch
        {
            return false;
        }
    }
}

現在、値パラメーターにはカルチャ キー/値がありませんが、ルート パラメーターにはそれがあります。

4

2 に答える 2

1

HomeController.Redirect() の実装は追加の値を追加していないように見えますが、なぜ「HomeRedirect」という名前のルートを含める必要があるのでしょうか?

それを削除して、「UrlResolver」という名前のルートにリクエストを処理させるのはどうですか。デフォルトは好きなように設定できます。

"UrlResolver" ルートの下に "catch all" ルートを追加して、CultureRouteConstraint() が指定された URL と一致しないケースをキャッチできます。

于 2010-06-30T16:59:46.877 に答える
1

2 番目のルールに指定された実際のルートは「{culture}/some」であるため、たとえば、ルールの名前ではなく「/EN-us/some」にリダイレクトする必要があります。

于 2010-06-30T17:23:21.007 に答える