【问题标题】:generic action method mvc with database call具有数据库调用的通用操作方法 mvc
【发布时间】:2017-01-04 07:01:53
【问题描述】:

我正在寻找一种方法来制作可以被多个控制器继承的通用操作方法,因此我不必在 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?我该怎么做?

如果这是非常基本的事情,我深表歉意;我可能不知道要寻找的正确条款。我已经搜索了通用操作方法,但我没有找到任何答案,尽管有一些关于通用控制器的东西 - 我是否需要以某种方式创建一个通用控制器类来包含这样的方法?

非常感谢。

【问题讨论】:

  • 您可能需要一个通用方法msdn.microsoft.com/en-us/library/twcad0zb.aspx 从您的控制器调用它
  • 谷歌“抽象方法”
  • @Shekhar 需要不仅仅是“阅读泛型”来处理“db.BACTERIA_EVW.Find”或保存更新......

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


【解决方案1】:

如果您只关心删除 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 操作也会发生同样的情况。

【讨论】:

  • 嗨 Yaser,我如何处理子控制器中的数据库调用?它是否“知道” awesomemodel 指的是我在子类中使用的模型?
  • 我以为您也想重用数据库代码,如果他们有不同的数据库代码,那么拥有该父控制器的意义何在。如果您关心代码重用,我建议您使用带有泛型的存储库模式以避免任何重复代码,那么所有数据库代码都可以在基类中处理
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多