2011-07-18 16 views
1

私はasp.net mvcフレームワークが重複のかなりのビットに向かって私を導いていることを発見しています。たぶん私は物事を行う正しい方法がわからないので、私はいくつかの領域を列挙し、誰かが正しいアプローチを提案するかもしれません:asp.net mvcと複製

一般的なパラメータを受け入れないコントローラメソッド。

class A 
class B : A 
class C : A 
class D : A 

とコントローラのメソッド::

EditB(B obj) 
EditC(C obj) 
EditD(D obj) 

すべてのコントローラは、まったく同じことを行うが、私は、私は一般的なコントローラパラメータを持つことができない1と仮定しています私は、次のような複数のクラスを、持っています2.モデルバインダーはクラスAにのみバインドされます。

次の問題は部分的な問題です。モデルが簡単に動作するように結合得るために、私は、次のようなメソッドを使用します。

Html.TextboxFor(m => m.blah.blahID) 

をしかし、部分的にのみ共通でm.blahを持つ複数のビュー間で共有されているとき、私が行います

RenderPartial("BlahPartial", m.blah); 

問題は今私がそれが部分的に不足しているように私が欲しいものを私に与えてくれるとは思わないということです。

最後に、コントローラの方法で、私はそれが難しいようinvidiual方法に共通するアルゴリズムを抽出するために見つける:私は、他の何に元のコントローラをそれらのものを返すことができないよう

if (a) 

return ActionResult("Blah"); 

else 

return ActionResult("Home"); 

(or RedirectToAction or return View("Home") etc.) 

はプライベートメソッドに入れてdiffucltように見えます。

答えて

2

あなたの質問は非常に一般的なので正しい軌道に乗せるかどうかはわかりませんが、おそらくモデルごとに別々のコントローラアクションが必要になると思います。つまり、コードを共有できないというわけではありません。これを行う1つの方法は、それぞれの特定のコントローラが派生する共通のベースコントローラを持つことです。すべてのコントローラー/モデルに共通するコードは、ベースコントローラーにリファクタリングすることができます。

限りパーシャルが行くように、あなたはViewDataを介して、接頭辞を提供することができます - あなたは簡単にプライベートメソッドを持つことができないと思い、なぜ私はよく分からないhttp://davybrion.com/blog/2011/01/prefixing-input-elements-of-partial-views-with-asp-net-mvc/

を参照してください。特定のモデルを返す、または特定のビューを名前で使用するプライベートメソッドを持つことは難しくありません。

private ActionResult RedirectOnSuccess<T>(T model, string action) where T : IBaseModel 
{ 
    if (model.IsValid()) 
    { 
     // save to database, etc. 
     return RedirectToAction(action); 
    } 
    return View(model); // will re-render the view corresponding to the called action 
} 

その後

public ActionResult Edit(SpecificModel model) 
{ 
    return RedirectOnSuccess(model, "index"); 
} 
としてそれを呼び出します