2017-01-03 49 views
0

我正在尋找一種方法來製作可由多個控制器繼承的通用操作方法,因此我不必在MVC中爲不同的控制器和表格重複相同的方法。我認爲這將適用於我必須經常爲多個班級所做的許多CRUD內容。帶數據庫調用的通用操作方法mvc

例如,這裏就是我想複製的代碼:

public ActionResult ToggleQC(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     BACTERIA_EVW bacteria = db.BACTERIA_EVW.Find(id); 
     if (bacteria == null) 
     { 
      return HttpNotFound(); 
     } 
     //add/remove QC status (switch to whichever one it isn't right now) 
     if (bacteria.QCOn == null) //if it hasn't been QCed 
     { 
      bacteria.QCOn = DateTime.Now; 
      bacteria.QCBy = User.Identity.Name; 
     } 
     else //if it has been QCed and they are undoing it 
     { 
      bacteria.QCBy = null; 
      bacteria.QCOn = null; 
     } 
     //save changes 
     db.Entry(bacteria).State = EntityState.Modified; 
     db.SaveChanges(); 
     //return updated QC status partial 
     return PartialView("_QCStatus", bacteria); 
    } 

我需要做同樣的事情在化學控制,但我寧願不重複整個事情,只是改變一個部分。是否可以將模型類型作爲參數傳遞給方法,以取代BACTERIA_EVW?我會怎麼做?

我很抱歉,如果這是真的基本的東西;我可能不知道尋找合適的條款。我已經搜索了通用操作方法,但我還沒有找到任何答案,雖然有關於通用控制器的一些東西 - 我是否需要製作一個通用控制器類來包含這樣的方法?

非常感謝。

+0

你可能需要的是一個通用的方法https://msdn.microsoft.com/en-us/library/twcad0zb.aspx從你的控制器調用它 – Shekhar

+0

谷歌「抽象方法」 – Steve

+0

@Shekhar需要超過只是「閱讀泛型」來處理「db。* BACTERIA_EVW * .Find」或保存更新... –

回答

0

如果你只關心刪除code redundancy您可以從創建與方法的generic controller和繼承等控制器:

namespace BaseControllers 
{ 
    public class CoolController 
    { 
     public virtual ViewResult Get() 
     { 
      var awesomeModel = new object(); 
      return View(awesomeModel); 
     } 
    } 
} 

而且在你的孩子控制器:

public class CoolController : BaseControllers.CoolController 
{ 
    public override ViewResult Get() 
    { 
     var ignoredResult = base.Get(); 
     // ViewData.Model now refers to awesomeModel 
     return View("NotGet"); 
    } 
} 

同樣也發生了其他CRUD操作。

+0

嗨Yaser,我該如何處理子控制器中的數據庫調用?它是否「知道」awesomemodel指的是我在子類中使用的模型? – Ella

+0

我以爲你也想重用db代碼,如果他們有不同的db代碼,那麼父控制器就有什麼用處。如果您關心代碼重用,我建議您使用帶有泛型的存儲庫模式以避免代碼重複,所有數據庫代碼都可以在基類中處理 – Yaser

相關問題