通用操作方法mvc与数据库调用

时间:2017-01-03 22:45:05

标签: c# asp.net asp.net-mvc

我正在寻找一种方法来制作可由多个控制器继承的通用操作方法,因此我不必在MVC中为不同的控制器和表重复相同的方法。我认为这适用于我经常为多个类做的很多CRUD的东西。

例如,这里是我要复制的代码:

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?我该怎么做?

如果这是非常基本的话,我道歉;我可能不知道要找的正确术语。我已经搜索了一般的动作方法,但是我还没有找到任何答案,虽然有一些关于通用控制器的东西 - 我是否需要以某种方式创建一个通用的控制器类来包含这样的方法?

非常感谢。

1 个答案:

答案 0 :(得分: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操作也会发生同样的情况。