Asp.Net MVC:URL でダッシュを有効にするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/30310

  •  09-06-2019
  •  | 
  •  

質問

URL 内の単語をダッシュ​​で区切りたいと考えています。したがって、代わりに:

/MyController/MyAction

私は…したい:

/My-Controller/My-Action

これは可能でしょうか?

役に立ちましたか?

解決

ActionName 属性は次のように使用できます。

[ActionName("My-Action")]
public ActionResult MyAction() {
    return View();
}

この場合、ビュー ファイルを「My-Action.cshtml」(または適切な拡張子) という名前にする必要があることに注意してください。また、Html.ActionLink メソッドで「my-action」を参照する必要があります。

コントローラーにはこれほど単純な解決策はありません。

編集:MVC5のアップデート

ルートをグローバルに有効にします。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapMvcAttributeRoutes();
    // routes.MapRoute...
}

MVC5 では、属性ルーティングがプロジェクトに組み込まれました。次のものを使用できるようになりました。

[Route("My-Action")]

アクションメソッドについて。

コントローラーの場合、 RoutePrefix そのコントローラーのすべてのアクション メソッドに適用される属性:

[RoutePrefix("my-controller")]

利用するメリットの一つに、 RoutePrefix URL パラメーターは、アクション メソッドにも渡されます。

[RoutePrefix("clients/{clientId:int}")]
public class ClientsController : Controller .....

をちょきちょきと切る..

[Route("edit-client")]
public ActionResult Edit(int clientId) // will match /clients/123/edit-client

他のヒント

このブログに示されているように、カスタム ルート ハンドラーを作成できます。

http://blog.didsburydesign.com/2010/02/how-to-allow-hyphens-in-urls-using-asp-net-mvc-2/

public class HyphenatedRouteHandler : MvcRouteHandler{
        protected override IHttpHandler  GetHttpHandler(RequestContext requestContext)
        {
            requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_");
            requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_");
            return base.GetHttpHandler(requestContext);
        }
    }

...そして新しいルート:

routes.Add(
            new Route("{controller}/{action}/{id}", 
                new RouteValueDictionary(
                    new { controller = "Default", action = "Index", id = "" }),
                    new HyphenatedRouteHandler())
        );

非常によく似た質問がここで行われました。 ハイフンを含む URL に対する ASP.net MVC のサポート

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

大文字の URL には問題があります。Cookie のパスでは大文字と小文字が区別されます。インターネットのほとんどでは実際には大文字と小文字が区別されますが、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

ここでは、ASP.NET MVC 5 のエリアを使用して私が行ったことを示します。それは魅力的に機能しました。ビューの名前を変更する必要もありませんでした。

RouteConfig.cs で次の操作を行います。

 public static void RegisterRoutes(RouteCollection routes)
    {
        // add these to enable attribute routing and lowercase urls, if desired
        routes.MapMvcAttributeRoutes();
        routes.LowercaseUrls = true;

        // routes.MapRoute...
    }

コントローラーで、クラス定義の前にこれを追加します。

[RouteArea("SampleArea", AreaPrefix = "sample-area")]
[Route("{action}")]
public class SampleAreaController: Controller
{
    // ...

    [Route("my-action")]
    public ViewResult MyAction()
    {
        // do something useful
    }
}

ローカル マシンでテストする場合、ブラウザに表示される URL は次のとおりです。 ローカルホスト/サンプルエリア/私のアクション. 。ビューファイルなどの名前を変更する必要はありません。最終結果にはとても満足しました。

ルーティング属性を有効にすると、SampleAreaRegistration.cs などのエリア登録ファイルを削除できます。

これ 記事 この結論に至るのに役立ちました。お役に立てば幸いです。

Asp.Net MVC 5 は属性ルーティングをサポートし、ルート名をより明示的に制御できるようになります。使用例は次のようになります。

[RoutePrefix("dogs-and-cats")]
public class DogsAndCatsController : Controller
{
    [HttpGet("living-together")]
    public ViewResult LivingTogether() { ... }

    [HttpPost("mass-hysteria")]
    public ViewResult MassHysteria() { }
}

v5 より前の Asp.Net MVC を使用するプロジェクトでこの動作を実現するには、次のコマンドで同様の機能を見つけることができます。 属性ルーティングプロジェクト (また ナゲットとして利用可能)。実際、Microsoft は MVC 5 の実装を支援するために AttributeRouting の作成者に連絡を取りました。

Route クラス GetRouteData から派生するカスタム ルートを作成してダッシュを削除することもできますが、API を呼び出して URL を生成するときは、アクション名とコントローラー名のダッシュを忘れずに含める必要があります。

それはそれほど難しいことではありません。

次のような特定のルートを定義できます。

routes.MapRoute(
    "TandC", // Route controllerName
    "CommonPath/{controller}/Terms-and-Conditions", // URL with parameters
    new {
        controller = "Home",
        action = "Terms_and_Conditions"
    } // Parameter defaults
);

ただし、このルートは登録する必要があります 前に あなたのデフォルトルート。

IIS URL Rewrite モジュール ( http://blogs.iis.net/ruslany/archive/2009/04/08/10-url-rewriting-tips-and-tricks.aspx ) の場合は、URL を書き換えるだけで済みます。

/my-controller/my-action へのリクエストは /mycontroller/myaction に書き換えることができるため、カスタム ハンドラーなどを作成する必要はありません。訪問者はきれいな URL を取得し、あなたは MVC が理解できる URL を取得します。

以下は 1 つのコントローラーとアクションの例ですが、これをより一般的なソリューションに変更することもできます。

<rewrite>
  <rules>
    <rule name="Dashes, damnit">
      <match url="^my-controller(.*)" />
      <action type="Rewrite" url="MyController/Index{R:1}" />
    </rule>
  </rules>
</rewrite>

これの考えられる欠点は、開発中に書き換えを機能させるには、IIS Express または IIS を使用するようにプロジェクトを切り替える必要があることです。

私はまだ MVC に慣れていないので、話半分に聞いてください。これは洗練された包括的なソリューションではありませんが、MVC4 ではうまくいきました。

routes.MapRoute(
    name: "ControllerName",
    url: "Controller-Name/{action}/{id}",
    defaults: new { controller = "ControllerName", action = "Index", id = UrlParameter.Optional }
);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top