2012-01-06 11 views
1

私は複数のコントローラ間で共通の方法を持っています。メソッドをコントローラーベースに入れて、他のすべてのコントローラーを継承するのは正しいですか?複数のコントローラ間の共通のメソッド

public class BaseController : Controller 
{ 
    public IEnumerable<SelectListItem> GetStatus() 
    { 
     IList<SelectListItem> status = new List<SelectListItem>(); 

     status.Add(new SelectListItem() { Text = "Select", Value = "" }); 

     Enum.GetValues(typeof(Status)).Cast<Status>().ToList().Select(x => new SelectListItem() 
     { 
      Text = x.ToString(), 
      Value = ((byte)x).ToString() 
     }).ToList().ForEach(status.Add); 

     return status; 
    } 
} 

public class DownloadController : BaseController 
{ 
    public ActionResult New() 
    { 
     NewViewModel newViewModel = new NewViewModel(); 

     newViewModel.Status = GetStatus(); 

     return View(newViewModel); 
    } 
} 
+0

あなたがActionResultsを共有している場合、私は基本クラスでそれを行うことはOKです。ステータスのリストのようなプロパティやオブジェクトを共有したい場合は、それをある種のCommonクラスに入れて、それにアクセスします。 –

+0

うん、私もそれをする。それはあなたがそれで何をやっているかによって変わるかもしれません。 – tugberk

答えて

2

を、

newViewModel.Status = GetStatus(); 

私は、GetStatusesはコントローラのメソッドであってはならないと主張します。コントローラはHttp要求を処理し、http応答を返すべきです。これらのレスポンスはファイル、ビュー、jsonなどとすることができますが、これはあなたのGetStatusesの使い方ではなく、Httpレスポンスとして返されることは意図されていないためです。これが本当に事実ならば、それはどこに行くべきですか。

MVCアプリケーションには、常にビューモデルを提供するサービスレイヤがあります。したがって、私のアプリケーションでは、このサービスレイヤーがStatusesをサーバー化します。

1

私は、継承を超えて合成し、コードを別のオブジェクトにカプセル化し、オブジェクトをコントローラに注入します。特にこの場合には、

この場合、Enumリストのレンダリングを設定することは、部分的なコントローラ/ビューの方が適している可能性があります。

2

そうですね、静的で保護されている可能性があります。

+0

私はここで何かをキャッチします。私は '保護された'がそれにもたらすものを理解しますが、 '静的な'ものはここでは何が役に立つのでしょうか? – tugberk

+0

staticは、オブジェクトのインスタンスを作成せずにプロパティにアクセスできることを意味します。 –

+1

@tugberkあなたのメソッドはメンバーデータを使用するようには見えないので、事実上静的です。インスタンスに依存するのではなく、パラメータやその他の静的データに依存します(状況クラスを取り囲むタイプシステム/ enum) –

2

私は実際には別の方法を採用します。私は、次に、このために同様のいくつかのカスタムHTMLヘルパーを使用します。

http://blogs.msdn.com/b/stuartleeks/archive/2010/05/21/asp-net-mvc-creating-a-dropdownlist-helper-for-enums.aspx

あなただけ使うことができますこの方法:

<%: Html.EnumDropDownListFor(model => model.EnuProperty) %> 

私はあなたが使用することを可能にサイモンが提出した答えを好みます列挙型名の出力customzieするメタDescription属性:この行に基づいて

How do you create a dropdownlist from an enum in ASP.NET MVC?

関連する問題