保存前向控制器添加功能

贾济莫夫

我试图找出一种好的(如果可能的话,最好的)方法来构造一个解决方案,在该解决方案中,我可以在使用EF6将更改提交回数据库之前,对控制器中的MVC模型进行一些工作。

所以这是一个示例-我在我的一个控制器类中有以下代码:

    [HttpPost]
    [ValidateAntiForgeryToken]      
    public ActionResult Edit(Role role)
    {
        if (ModelState.IsValid)
        {
            db.Entry(role).State = EntityState.Modified;
    //***********---> HERE IS WHERE I WOULD PLACE THE PRE-SAVECHANGES CALL
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(role);
    }

如上所述,我想在db.SaveChanges()之前调用“ pre-savechanges”函数。关键是我想对所有控制器执行此操作,并且我希望在所有控制器中调用此函数的方式都相同,以便此预保存实现是一致的(换句话说,函数名称应该相同,并且应该将模型作为参数-我正试图避免以任何方式将函数名称与模型名称绑定在一起)。例如,该函数可以称为PreSaveChanges,它将需要访问将要持久化的模型(角色,在这种情况下,如上面的代码所示)。

我知道有很多方法可以实现此目的,但我想到的一种方法是仅向每个模型添加一个函数-但我没有看到模型中的函数示例,而且我没有足够的经验来理解结果(例如作为可测试性)。我还考虑了某种控制反转/依赖注入解决方案,因为这通常是一个流行的选择。无论采用哪种方法,我都不需要实际保存pre-savechanges功能。换句话说,某些控制器将具有需要在持久化之前进行预处理的模型,而其他控制器则不需要。我仍然希望我所有的控制器都尝试调用pre-savechanges函数,但是如果尚未定义或不存在它,那么那就是“

因此,快速浏览一些选项:

  1. 我曾考虑过在实用程序类中创建一个静态函数,该函数会将我的模型(在这种情况下,是保修模型)作为一个参数-但后来我不知道接收函数是应该接受通用类型还是应接受类型为“对象”类型-两者都需要一些反射代码,以便我知道已传递了哪种模型。我可能会有一个很大的'if'块来查看类型(如果是角色,则执行此操作;如果是用户,则执行此操作;等等)。我的控制器中的调用可能看起来像这样:

    Utility.PreSaveChanges(warrantymodel);
    

如果您认为这是最好的方法,那么PreSaveChanges应该具有类型为object的参数还是应该接受通用类型?

  1. 我还认为可以将pre-save函数放入模型本身。我喜欢在模型中包括预保存功能代码的想法,如上所述,但是我只是不知道这是一个好主意。该代码如下所示:

    warrantymodel.PreSaveChanges();
    

如果您认为这是最好的方法,那么您可以确认在模型中包含函数是可以的吗?这会打破某种MVC原则吗?

我只是摸摸了依赖注入的表面,所以我不知道这是否对您有帮助。如果可以的话,我很乐意看到一个简短的示例(我对DI已有足够的了解,因此无需过多解释就可以理解它)。

杰森·罗尔(Jason Roell)

如果您在模型类中进行任何工作,那么不仅模型类中应该包含函数,还应该包含函数。将模型的行为和逻辑封装在模型所属的模型类中。永远不在控制器中!想想FAT模型,SKINNY控制器。

其次,如果您想PreSaveChanges在所有模型上实现该功能,则可能会创建一个类似的接口IPreSaveFunctionality,其中包含一个PreSaveChanges方法存根,并让每个模型都实现您希望的接口PreSaveChanges

但是,如果您传递给它的任何模型的逻辑都是相同的,那么我将创建一个BaseModel类并该类中创建一个虚拟方法,并让您的所有其他模型派生自其中,BaseModel并且某些模型对此功能的实现方式有所不同那么您始终可以PreSaveChanges在该模型类中覆盖该单个模型的实现

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何向现有控制器添加新动作?

来自分类Dev

在操作前添加浅层嵌套关联控制器

来自分类Dev

Rails-设计-向控制器添加操作

来自分类Dev

向UIImagepicker控制器导航nar添加后退按钮

来自分类Dev

无法添加功能Odata WebAPI控制器

来自分类Dev

Zend Framework向静态控制器添加路由

来自分类Dev

向控制器发送外键

来自分类Dev

在AngularJS中向控制器添加服务

来自分类Dev

子类化视图控制器:前向声明

来自分类Dev

向Angular指令控制器(例如FormController)添加属性

来自分类Dev

向所有控制器AngularJS添加方法

来自分类Dev

Rails,通过向控制器添加自定义方法向关联表添加数据

来自分类Dev

Magento向控制器添加错误消息

来自分类Dev

Rails:向控制器添加动作

来自分类Dev

如何向控制器发送参数?

来自分类Dev

cakephp控制器添加功能的问题

来自分类Dev

从View向控制器传递值

来自分类Dev

如何从外部控制器向事件添加事件侦听器?

来自分类Dev

无法添加功能Odata WebAPI控制器

来自分类Dev

从视图向控制器插入日期

来自分类Dev

子类化视图控制器:前向声明

来自分类Dev

向Angular指令控制器(例如FormController)添加属性

来自分类Dev

从控制器向div添加动画类

来自分类Dev

向控制器的角度推入结果

来自分类Dev

Magento向控制器添加错误消息

来自分类Dev

Rails:向控制器添加动作

来自分类Dev

向控制器添加计数器。滑轨4

来自分类Dev

控制器添加失败

来自分类Dev

向现有控制器添加新动作