2012-01-13 5 views
2

私は異なるModelsのために(同じコントローラ内で)このアクションコードを10回以上書いています。このコードを減らす方法があるのですか、または一般的なアクションを作成する方法はありますか?コントローラのアクションをasp.net mvc3に再組み込み

[HttpPost] 
    public ActionResult SavePerson(Person p) 
    { 
     if (ModelState.IsValid) 
     { 
      //do something 
      return Redirect("/Main"); 
     } 
     else 
     { 
      return View(); 
     } 
    } 


    [HttpPost] 
    public ActionResult SaveCategory(Category c) 
    { 
     if (ModelState.IsValid) 
     { 
      //do something 
      return Redirect("/Main"); 
     } 
     else 
     { 
      return View(); 
     } 
    } 

答えて

-2

あまりにも頻繁に呼び出される関数については、静的クラスを作成し、その中のすべての関数を定義します。例えば

その後

public static class MyAppStaticClass 
{ 
    public static SavePerson(Person p) 
    { 
     ... // your body 
    } 
} 

を次のようにあなたがそれを必要なとき、あなたはMyAppStaticClass.SavePersonのようにそれを参照することができます。

+0

これらはアクションです! –

+0

ohhh k .... if(ModelState.IsValid)とリダイレクト/リターンステートメントのいくつかのリファクタリングが必要だと言っています。申し訳ありませんが、私はあなたが '// do something'のリファクタリングを探していると思いました –

0
return ModelState.IsValid ? Redirect("/Main"):View(); 

開始点は必要な行だけです。

+0

しかし、私は複数のアクションを作成する必要があります。 –

+0

うん、私はちょっとだけあなたがそれぞれ持っているものを壊した、私はmvc3に精通していないので、アクションなど - あまり確かではないが、あなたが必要とするコードをトリミングするので誰かがあなたを助けることができるアクションのものとあなたはそのことで全部をトリミングすることができます... – Chris

6

重要な点は、//do somethingの部分は常にアクションごとに異なります。ですから、それ以外のコードをすべて減らそうとしましょう。あなたはそれ

public class BaseController : Controller 
{ 
    [NonAction] 
    protected virtual ActionResult HandlePost<T>(T model, Action<T> processValidModel) 
    { 
     if (ModelState.IsValid) 
     { 
      processValidModel(model); 
      return RedirectToAction("Main"); 
     } 
     else 
     { 
      return View(model); 
     } 
    } 
} 

のためのベースコントローラを使用することができ、派生コントローラに

public class DerivedController : BaseController 
{ 
    [HttpPost] 
    public ActionResult Create(Person person) 
    { 
     return HandlePost(person, p => _repository.Save(p)); 
    } 
} 
+0

エレガント。私はこれを答えとしてマークしたいと思います。 – Roman

関連する問題