2016-06-14 5 views
0

説明MVC属性ルーティングでコントローラの名前を設定する方法は?


私は私のMVCコントローラのいずれかにルーティングのみ属性使用しています:

@Html.ActionLink("Text", "Edit", new {controller = "Groups", id = "someId"}) 
次のようなヘルパーを使用したときに、カミソリビューで

[RoutPrefix("Groups")] // NOTE: I want to use "Groups" with an "s" here. 
public class GroupController : Controller 
{ 
    [HttpGet] 
    [Route("Edit/{id}")] 
    public ActionResult Edit(Guid id) 
    { 
     //... 
    } 

    [HttpPost] 
    [Route("Edit")] 
    public ActionResult Edit(GroupEditViewModel model) 
    { 
     // ... 
    } 
} 

または

ヘルパー関数によって生成されたの
@Html.BeginForm(actionName: "Edit", controllerName: "Groups") 
{ 
} 

経路はnullある:

<a href>Text</a> 

<form action></form> 

質問


  • コントローラーの名前が不明なのでこれは起こりますか?
  • を使用してコントローラの名前を設定する方法はありますか?属性ルーティングのみ?属性のルーティングのために知られて

答えて

3

共通プラクティスは、コントローラの名前と同じ名前のRoutePrefixを設定している:

[RoutePrefix("Group")] 
public class GroupController : Controller 
{ 
    // ... 
} 

しかし、私はhereを見ていたとして、カスタム名(複数可)、オリジナルを削除/変更せずに設定することができますルート:

[RoutePrefix("Groups")] 
public class GroupController : Controller 
{ 
    // ... 
} 

RoutePrefix属性のみが元の名前を変更しない、対応するコントローラにアクセスするための別の方法を与えることを忘れないでください。

ルートプレフィックスは、適用したいルートのプレフィックスだけです。コントローラ内のルートプレフィックスを定義して、その内部のすべてのアクションメソッドがプレフィックスに従うようにするだけです。

OTPでは、「グループ」はコントローラクラスではなくパラメータ値であるため、「グループ」をコントローラ名として使用するすべてのHTMLヘルパーはそれぞれのHTML属性でnull値を返します。RoutePrefix効果を有効にする

// note that "Group" controller declared with "Groups" as part of relative URL 
routes.MapRoute("Groups", "Groups/{action}/{id}", new { controller = "Group", action = "Edit", id = UrlParameter.Optional }); 

@Html.ActionLink("Text", "Edit", new {controller = "Group", id = "someId"}) 

@Html.BeginForm(actionName: "Edit", controllerName: "Group") 
{ 
} 

または元のコントローラの名前と一緒にURLを操作するRegisterRoutes方法内側MapRouteを使用します。したがって、元のコントローラの名前ではなくRoutePrefix値を使用しなければならない

ルーティングする場合は、メソッドにMapMvcAttributeRoutes()を挿入する必要があります。

CMIIW。

0

ルートプレフィックス属性[RoutPrefix("Groups")]は、結果のURLを制御します。しかしMVCでは、常にクラス名をコントローラの名前として使用します。

これらは同じである必要はありません。ルートプレフィックスを使用して結果のURLを制御し、必要な場合はコントローラ名としてクラス名を使用し、結果のURLが正しいことができます。あなたの例では

[RoutPrefix("Groups")] 
public class GroupController : Controller 
{ 
    [HttpGet] 
    [Route("Edit/{id}")] 
    public ActionResult Edit(Guid id) 
    { 
     //... 
    } 

    [HttpPost] 
    [Route("Edit")] 
    public ActionResult Edit(GroupEditViewModel model) 
    { 
     // ... 
    } 
} 

@Html.ActionLink("Text", "Edit", new {controller = "Group", id = "someId"}) 

はこのように見えたリンクにつながる(「グループ」コントローラ名にもかかわらず、URL内の「グループ」に注意してください) :

<a href="/Groups/Edit/someId">Text</a> 
関連する問題