2017-02-20 6 views
1

to this questionと同様ですが、新しいASP.NETコア用です。ASP.NETコアでコントローラー名をオーバーライドする

私はアクションのルーティング名を上書きすることができます。

[ActionName("Bar")] 
public IActionResult Foo() { 

私は、コントローラのために、ルーティング属性を使用していることを行うことができますか?

[?("HelloController")] 
public SomeController : Controller { 

これは、タグヘルパーを使用して、リンクの生成を可能にする必要があります。

<a asp-controller="some" ...  // before 
<a asp-controller="hello" ...  // after 
+0

[ApiVersion( "1.0")]を使用して[Route( "api/v {バージョン:apiVersion}/[コントローラ]")]を使用します。 –

答えて

6

そこにそれらを手動で登録する必要がありますような一般的なルートを使用することはできません。しかし、あなたは1を自分で作成することができます。

[AttributeUsage(AttributeTargets.Class)] 
public class ControllerNameAttribute : Attribute 
{ 
    public string Name { get; } 

    public ControllerNameAttribute(string name) 
    { 
     Name = name; 
    } 
} 

は、コントローラ上でそれを適用します。

[ControllerName("Test")] 
public class HomeController : Controller 
{ 
} 

は、次にカスタムコントローラ規則作成:

public class ControllerNameAttributeConvention : IControllerModelConvention 
{ 
    public void Apply(ControllerModel controller) 
    { 
     var controllerNameAttribute = controller.Attributes.OfType<ControllerNameAttribute>().SingleOrDefault(); 
     if (controllerNameAttribute != null) 
     { 
      controller.ControllerName = controllerNameAttribute.Name; 
     } 
    } 
} 

を、スタートアップにおけるMVCの規則に追加します。 cs:

services.AddMvc(mvc => 
{ 
    mvc.Conventions.Add(new ControllerNameAttributeConvention()); 
}); 

今すぐHomeControllerインデックスアクションは/Test/Indexで応答します。あなたが望むように、かみそりタグヘルパー属性を設定することができます。

少なくとも、ReSharperはRazorで少し壊れてしまうという欠点しかありません。それは規則を認識していないので、asp-controller属性が間違っていると思っています。

+1

これはフレームワーク内にある必要があります。 – grokky

1

それはあなたがコア前にASP.NET WebAPI2でそれを行うのと同じ方法でなければなりません:

[Route("Bar")] 
public IActionResult Foo() { } 

コントローラーレベルでも同様の操作を行う場合は、それとは異なる属性があります。

[RoutePrefix("ControllerFoo")] 
public class MyController() { } 

Hereは、.NETコアでの処理方法を説明する(Microsoft以外の)記事です。ここで

+0

タグヘルパーで私にとってうまくいきません。 – grokky

+0

タグヘルパーをしているときは重要ですか?私は「合理的ではない」コントローラをいくつか持っていますが、関連性があるようにルートを修正しました。 – ganders

+0

残念ながら、私は数十の意見をリファクタリングする必要があるので問題になります。私はちょうど1つの場所で名前を変更する方法を望んでいました。また、すべてのコントローラーのアクションがすでにルートを指定しています。タグヘルパーと一緒に作業するには、これが特に必要です。 – grokky

2

はあなたがちょうど[controller]プレースホルダを残して、コントローラクラス(クラス名マイナスコントローラsurfix)からコントローラ名を導出したくない場合は、我々は

[ApiVersion("1.0")] 
[Route("api/v{version:apiVersion}/[controller]")] 
public class MembersController : Controller { /* */ } 
+0

この場合のコントローラの名前は何ですか?リンクを生成するために使用できますか? – grokky

+1

'[controller]'は、コントローラークラス名から「Controller」という単語を差し引いたプレースホルダーであるため、「Members」です。 – juunas

+0

@juunasは間違いありません! –

3

を使用しているコードです。

[Route("/api/hello")] 
public SomeController : Controller { 
    [HttpGet] 
    public IActionResult Get() { } 

    [HttpGet("something")] 
    public IActionResult GetSomething() { } 
} 

HttpGetでのオーバーロードは、アクション名を設定します。そうしかしこう、あなたは

routes.MapRoute("default", "api/{controller}/{id?}"); 

か、そのような属性が存在しない

routes.MapRoute("hello", "api/hello/{id?}", defaults: new { controller = "Hello" }); 
routes.MapRoute("default", "api/{controller}/{id?}"); 
関連する問題