2009-08-26 13 views
4

MVCを使用する正しい方法を理解する上で問題があると思います。私がいる問題は、私は両方のキャンペーンを作成することが許可され、ユーザーと管理者ユーザーを持っているということですが、彼らは別のマスターページを使用しているなどなどMVCコントローラでのコードの複製

私のソリューションこれまでされています...

Controllers 
    AdminUserController.cs 
    UserController.cs 

Views 
    AdminUser 
     CreateCampaign.aspx 
    User 
     CreateCampaign.aspx 

しかし、このようにして、私はAdminUserControllerとUserControllerの両方でCreateCampaign()コードを複製する必要があり、同じことをするために2つのビューがあります。

これは正しい方法ですか、私は船をどこかで逃していますか?

答えて

9

両方とも継承するベースコントローラーに共通コードを抽出します。共有ビューを共通の共有パーシャルビュー(ViewUserControl)に抽出し、各ビューにこの共有パーシャルが含まれるようにします。後者は、ビューが異なるマスターページを使用するため、実際には必要です。

コントローラ:

BaseUserController 
    CreateCampaign() 

UserController : BaseUserController 
AdminController : BaseUserController 

再生回数:

Shared 
    CreateCampaignShared.ascx 
    Admin.Master 
    User.Master 
Admin 
    CreateCampaign.aspx -- includes <% Html.RenderPartial("CreateCampaignShared"); %> 
User 
    CreateCampaign.aspx -- includes <% Html.RenderPartial("CreateCampaignShared"); %> 
2

1つのコントローラでうまくいく場合は、UserControllerに任せてください。管理者は別のユーザーに過ぎません。 CreateCampaign()コードでは、ログインしたユーザーの「特別な」ステータスをチェックし、データを保存する前に追加のプロパティを設定できます。

あなたが共有表示を解除できるかどうかは、その程度によって異なります。ビューで単純なIsAdmin()チェックを使用して、レンダリングしたり、いくつかの追加のコントロールをレンダリングしたりすることはできません。または、コントローラで確認して、1つのビューまたは別のビューを提供できます。

1

なぜ2つの異なる「ユーザー」がありますか?私は1人のユーザーが好きです - クラスとロールは異なるビュー/アクションへのアクセスを提供します

次に、Campain-Controllerを作成し、そこにCreateCampaign-Actionを作成します。

0

あなたが部分的にボートを逃している:)

あなたは一般的なビューのコードを共有する1つのCreateCampaign.ascxファイルを作成することができますし、他のビューでそれを部分ビューとして呼び出すことができます。完全なビューを作成する代わりに、部分ビュー(.ascxファイル)を作成し、重複したコードとマークアップを含むようにします。

その後、あなたはこれで、他のビューでそれを再使用することができます。

<% Html.RenderPartial("CreateCampaign") %> 

特定のコントローラが継承いくつかのベースコントローラにそれを加味して、コントローラのコードを再利用します。

0

Createメソッドを持つCampaignControllerを持つことで、ユーザーのタイプに応じてさまざまなビューが表示されます。何かのように:他の人が言っているよう

public class CampaignController : Controller { 

    public ActionResult Create() { 
    //... 
    if (User.IsInRole("Admin") { 
     Return View("AdminUser/CreateCampaign"); 
    } 
    else { 
     Return View("User/CreateCampaign"); 
    } 
    } 

} 

とビューで重複したマークアップ/コードは、部分的なビューに区切るべきであると、その後れるrenderPartialは()を使用:

<% Html.RenderPartial("Campaign") %> 
0

それは表示と同じくらい簡単だ場合あなたは次のようにコントローラからビューに使用するマスターページを設定することができます管理者であるユーザに異なるマスター: -

return View("CreateCampaign", User.IsInRole("Admin") ? "Admin", "User"); 

これは、単一のキャンペーンの続きを持ってできるようにする必要があります特定のタイプのユーザー専用のコントローラー(実装の詳細のように聞こえます)よりも私には自然なようです。

関連する問題