18

ルートをデフォルトで小文字に設定するのに問題があります。何らかの理由で動作しません。自分で設定authorizehomeて小文字にすることはできますが、Admin部分(領域)は引き続き大文字になります。

@Html.ActionLink("Hello World", "Authorize", "Home")
に出力
<a href="/Admin/Home/Authorize">Hello World</a>

エリアルート

public override void RegisterArea(AreaRegistrationContext context)
        {
            context.Routes.LowercaseUrls = true;
            context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                new string[] { "OR.Areas.Admin.Controllers" }
            );
            context.Routes.LowercaseUrls = true;
        }

デフォルトルート

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.LowercaseUrls = true;
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.LowercaseUrls = true;
            routes.MapRoute(
                name: "Localization",
                url: "{lang}/{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces: new string[] { "OR.Controllers" }
            );
            routes.LowercaseUrls = true;
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces: new string[] { "OR.Controllers" }
            );

            routes.LowercaseUrls = true;
        }

私が試した管理エリアの構成

// admin/Home/Authorize
public override void RegisterArea(AreaRegistrationContext context)
{
    context.Routes.LowercaseUrls = true;
    context.MapRoute(
        "Admin_default",
        "{area}/{controller}/{action}/{id}",
        new { area = "admin", controller = "home", action = "Index", id = UrlParameter.Optional },
        new string[] { "ORMebeles.Areas.Admin.Controllers" }
    );
    context.Routes.LowercaseUrls = true;
}

// admin/Home/Authorize
public override void RegisterArea(AreaRegistrationContext context)
{
    context.Routes.LowercaseUrls = true;
    context.MapRoute(
        "Admin_default",
        "admin/{controller}/{action}/{id}",
        new { controller = "home", action = "Index", id = UrlParameter.Optional },
        new string[] { "ORMebeles.Areas.Admin.Controllers" }
    );
    context.Routes.LowercaseUrls = true;
}

編集

これはMVC4のバグのようです。設定context.Routes.LowercaseUrls = true;した場合、Area / Areascontext.Routes.LowercaseUrls = true;は効果がありません。どこに報告すればよいですか、またはどのように修正できますか?

4

4 に答える 4

6

これはMVC4に関連するバグであり、MVC5リリースで修正される予定です。Routes.LowercaseUrlsエリアには影響しません。詳細はこちら

一方、WebApiサポートが必要な場合は、LowercaseRoutesMVCまたはLowercaseRoutesMVC4 を使用できます。

于 2013-10-16T12:53:00.317 に答える
1

この特定のブールフラグをMVC3プロジェクトで機能させるために、いくつかの試みを試みましたが、運がありませんでした。それを機能させる唯一の方法は、 MVC4アプリケーションプロジェクトを作成し、アプリの起動時にRouteConfig.csファイルにフラグを設定することでした。 本当に悪い部分は、私がエリアを追加するまで、サイト全体のURLを自動的に小文字にして、それからどこでも壊れてしまったことです。新しく追加された領域をプロジェクトから除外して再実行すると、URLは再び小文字になりました。

そのフラグを使用すると、何かがおかしくなります。URLを小文字にするためのnugetパッケージをダウンロードすることをお勧めします。彼らは新しいフレームワークのこの部分のねじれを完全には解決していないようです。

申し訳ありませんが、これ以上お役に立てることはありません。

于 2012-10-11T12:55:43.933 に答える
1

更新:MVC4アプリケーションで

新しい空のMVC4アプリケーションを作成し、Test.cshtmlビューとTestController.csコントローラーを使用してテストと呼ばれる領域を追加します。

それで私は何かを理解しました...それが合理的な解決策であるかどうかはわかりませんが。ルート登録ルーチンで遊んだ後、プロジェクトに領域を含めても、小文字の機能が損なわれることはありません。

namespace MvcApplication1.Areas.Test
{
public class TestAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Test";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        //This line breaks the functionality in the area registration.
        context.MapRoute(
            "Test_default", // Route name
            "Test/{controller}/{action}/{id}", // URL with parameters
            new { controller = "Test", action = "Index", id = "" }, // Parameter defaults
            new string[] { "MvcApplication1.Areas.Test.Controllers" } //namespace
            );
    }
}
}

回避策:

行をコメントアウトする

        //context.Routes.LowercaseUrls = true;
        //context.MapRoute(
        //    "Test_default", // Route name
        //    "Test/{controller}/{action}/{id}", // URL with parameters
        //    new { controller = "Test", action = "Index", id = "" }, // Parameter defaults
        //    new string[] { "MvcApplication1.Areas.Test.Controllers" } //namespace
        //    );

RouteConfig.cs内

namespace MvcApplication1
{
public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.LowercaseUrls = true;

        routes.MapRoute(
            "Default", 
            "{controller}/{action}/{id}", 
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

        routes.MapRoute(
            "Test_default", // Route name
            "Test/{controller}/{action}/{id}", // URL with parameters
            new { controller = "Test", action = "Index", id = "" }, // Parameter defaults
            new string[] { "MvcApplication1.Areas.Test.Controllers" } //namespace
            );
    }
}
}

エリアコントローラのアクションメソッドで

    public ActionResult Index()
    {
        // Key if statement to make sure the area maps correctly
        if (!this.ControllerContext.RouteData.DataTokens.ContainsKey("area"))
        {
            this.ControllerContext.RouteData.DataTokens.Add("area", "Test");
        }
        return View("Test");
    }

プロジェクトのメインページのリンクの結果のHTML

 <ul id="menu">
   <li><a href="/">Home</a></li>
   <li><a href="/home/about">About</a></li>
   <li><a href="/home/contact">Contact</a></li>
   <li><a href="/test?area=Test">Test</a></li>
 </ul>

ただし、クエリ文字列変数は小文字ではなく、SEO対応のURLではないことに注意してください。しかし、それはビューを見つけます。これは、私がそのフラグを使用してURLを小文字にすることができたのと同じくらい近いです。

于 2012-10-15T19:18:17.443 に答える
-1

私が知っているLowercaseUrls = trueように、.NET4.5でのみ利用可能です。おそらく、小文字のURLの拡張機能をいくつか書くことができます。URLを小文字にすることを参照できます。詳細情報の簡単な方法または組み込みの方法。

于 2013-04-23T07:27:08.530 に答える