URL 内の単語をダッシュで区切りたいと思います。したがって、代わりに:
/MyController/MyAction
私は…したい:
/My-Controller/My-Action
これは可能ですか?
URL 内の単語をダッシュで区切りたいと思います。したがって、代わりに:
/MyController/MyAction
私は…したい:
/My-Controller/My-Action
これは可能ですか?
次のようにActionName属性を使用できます。
[ActionName("My-Action")]
public ActionResult MyAction() {
return View();
}
次に、ビューファイルを「My-Action.cshtml」(または適切な拡張子)と呼ぶ必要があることに注意してください。また、Html.ActionLinkメソッドで「my-action」を参照する必要があります。
コントローラーのためのそのような単純な解決策はありません。
ルートをグローバルに有効にします。
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapMvcAttributeRoutes();
// routes.MapRoute...
}
MVC5により、属性ルーティングがプロジェクトに吸収されました。これで、次を使用できます。
[Route("My-Action")]
アクションメソッドについて。
コントローラの場合、そのコントローラのRoutePrefix
すべてのアクションメソッドに適用される属性を適用できます。
[RoutePrefix("my-controller")]
使用する利点の1つは、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())
);
非常によく似た質問がここで尋ねられました: ASP.net MVC support for URL's with hyphens
これは、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 は、localhost/sample-area/my-actionです。ビュー ファイルなどの名前を変更する必要はありません。私は最終結果にとても満足していました。
ルーティング属性を有効にしたら、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 を使用するプロジェクトでこの動作を取得するには、同様の機能をAttributeRouting プロジェクト( nuget としても利用可能) で見つけることができます。実際、Microsoft は AttributeRouting の作成者に連絡を取り、MVC 5 の実装を支援しました。
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 書き換えモジュール ( 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 }
);