2017-01-03 16 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

相关问题