4

CamelCase アクションとビューを自動的にハイフネーションする方法を特に探しています。つまり、実際にビューの名前を変更したり、サイト内のすべての ActionResult にデコレータを追加したりする必要がないことを願っています。

これまで、ここroutes.MapRouteLowercaseに示すように を使用してきました。これは、URL 構造の小文字の側面ではうまく機能しますが、ハイフンでは機能しません。そのため、最近Canonicalize (NuGet経由でインストール)で遊んでみましたが、ハイフン用のものもまだありません。

やってみた...

routes.Canonicalize().NoWww().Pattern("([a-z0-9])([A-Z])", "$1-$2").Lowercase().NoTrailingSlash();

私の正規表現は、URL を適切に再構築する限り、間違いなく希望どおりに機能しますが、もちろん、それらの URL は識別されません。ChangePassword.cshtmlたとえば、ファイルはまだであるため、それ/account/change-passwordを指すことはありません。

ところで、私はまだ .NET MVC に少し慣れていません。v2.0以降、数年間使用していません。

4

4 に答える 4

3

これは少し面倒かもしれませんが、カスタムのHttpHandlerRouteHandlerを作成した場合は、すべてのビューとアクションの名前を変更する必要がなくなります。ハンドラーは、要求されたアクションからハイフンを取り除くことができます。これにより、「change-password」が changepassword に変更され、ChangePassword アクションがレンダリングされます。

コードは簡潔にするために短縮されていますが、重要な部分はそこにあります。

public void ProcessRequest(HttpContext context)
{
    string controllerId = this.requestContext.RouteData.GetRequiredString("controller");
    string view = this.requestContext.RouteData.GetRequiredString("action");

    view = view.Replace("-", "");
    this.requestContext.RouteData.Values["action"] = view;

    IController controller = null;
    IControllerFactory factory = null;

    try
    {
        factory = ControllerBuilder.Current.GetControllerFactory();
        controller = factory.CreateController(this.requestContext, controllerId);

        if (controller != null)
        {
            controller.Execute(this.requestContext);
        }
    }
    finally
    {
        factory.ReleaseController(controller);
    }
}

私がそれを最良の方法で実装したかどうかはわかりません。それは、私が遭遇した最初のサンプルから多かれ少なかれ取ったものです。私は自分でコードをテストしたので、これは正しいアクション/ビューをレンダリングし、トリックを行うはずです.

于 2011-12-15T01:45:28.640 に答える
3

この問題のために、EveryMvc/Url を Every-mvc/url に暗黙的に変換するオープン ソースのNuGet ライブラリを開発しました。

Cookie パスでは大文字と小文字が区別されるため、大文字の URL には問題があります。インターネットのほとんどは実際には大文字と小文字を区別しますが、Microsoft テクノロジは URL を大文字と小文字を区別しないものとして扱います。(私のブログ投稿の詳細)

NuGet パッケージ: https://www.nuget.org/packages/LowercaseDashedRoute/

これをインストールするには、プロジェクトを右クリックして NuGet パッケージ マネージャーを選択し、[オンライン] タブで [小文字の破線ルート] と入力して、Visual Studio で NuGet ウィンドウを開きます。

または、パッケージ マネージャー コンソールで次のコードを実行することもできます。

Install-Package LowercaseDashedRoute

その後、App_Start/RouteConfig.cs を開き、既存の route.MapRoute(...) 呼び出しをコメント アウトして、代わりにこれを追加する必要があります。

routes.Add(new LowercaseDashedRoute("{controller}/{action}/{id}",
  new RouteValueDictionary(
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }),
    new DashedRouteHandler()
  )
);

それでおしまい。すべての URL は小文字化され、破線で示され、何もしなくても暗黙的に変換されます。

オープン ソース プロジェクトの URL: https://github.com/AtaS/lowercase-dashed-route

于 2013-08-03T15:25:08.897 に答える
0

URL Rewrite パッケージを試してみましたか? 私はそれがあなたが探しているものだと思います。

http://www.iis.net/download/urlrewrite

Hanselman の素晴らしい例がここにあります。

http://www.hanselman.com/blog/ASPNETMVCAndTheNewIIS7RewriteModule.aspx

また、 ReSharper や CodeRush などをダウンロードして、それを使用してアクションとルートの名前をリファクタリングしてみませんか? とても簡単で、とても安全です。

1 時間のリファクタリングでルーティング/アクションの命名規則を修正するのに十分な時間を費やすことができ、ルーティング規則を必要に応じて変更するために既に費やしたすべての時間よりもはるかに少ない時間で済みます。

ちょっとした考え。

于 2011-12-20T17:58:17.677 に答える
0

上記の受け入れられた回答で解決策を試しました: Canonicalize パターン URL 戦略を使用し、カスタム IHttpHandler を返すカスタム IRouteHandler も追加します。それはほとんどうまくいきました。ここに私が見つけた1つの警告があります:

典型的な{controller}/{action}/{id}デフォルト ルート、 という名前のコントローラーCatalogController、およびその内部のアクション メソッドを次のように使用します。

ActionResult QuickSelect(string id){ /*do some things, access the 'id' parameter*/ }

「/catalog/quick-select/1234」へのリクエストは完全に機能することに気付きましたが、/catalog/quick-select?id=1234 へのリクエストは 500'ing でしたcontroller.Execute()idアクション メソッド内では null です。

正確な理由はわかりませんが、MVC がモデル バインド中に値のクエリ文字列を見ていないかのように動作していました。したがって、受け入れられた回答の実装に関する何かがProcessRequest、通常のモデル バインディング プロセス、または少なくともクエリ文字列値プロバイダーを台無しにしていたのです。

これは取り決めを破るものなので、デフォルトの MVC IHttpHandler を調べてみました (オープン ソースです!): http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/MvcHandler.cs

私はそれを完全に理解したふりをするつもりはありませんが、明らかにProcessRequest、受け入れられた回答で起こっていることよりも、その実装において多くのことを行っています。

では、MVC がコントローラー/アクションを見つけられるように、着信ルート データからダッシュを削除するだけでよいのであれば、悪臭を放つ IHttpHandler 全体を実装する必要があるのはなぜでしょうか? ありません!GetHttpHandlerのメソッドでダッシュを切り取ってすぐに使用できるようにDashedRouteHandler渡すだけで、252 行の魔法を実行できます。ルート ハンドラーは、2 番目のレートの IHttpHandler を返す必要はありません。requestContextMvcHandler

tl:dr; - これが私がしたことです:

public class DashedRouteHandler : IRouteHandler
    {
        public IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            requestContext.RouteData.Values["action"] = requestContext.RouteData.GetRequiredString("action").Replace("-", "");
            requestContext.RouteData.Values["controller"] = requestContext.RouteData.GetRequiredString("controller").Replace("-", "");

            return new MvcHandler(requestContext);
        }
    }
于 2013-10-09T17:17:39.160 に答える