Asp.Net MVC:URL でダッシュを有効にするにはどうすればよいですか?
-
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 }
);