2011-04-16 129 views
0

最初这将是一个问题,如何执行任务,但现在它已成为最佳实践问题。为什么MVC中Controller类的TryUpdateModel受到保护?

我正在使用MVC(对它还是新的),我试图创建一个任何控制器可以调用的方法,它将运行一个通用的功能。在该方法中,我需要运行控制器的TryUpdateModel方法。这是我遇到了障碍的地方 - 除非方法在控制器中,否则我无法执行此操作,因为TryUpdateModel由于其保护级别而无法访问 - 它被标记为“受保护”。如果我必须使这种方法对每个控制器都是私有的,那么它将首先破坏方法的全部目的,并且我会复制粘贴很多代码。

所以我想知道,为什么这种方法保护?当然,我一定会错过显而易见的东西。 (并请做棚灯)

我最终在创建自己的基类控制器类的控制器类时做了些什么。这个新的类包含我需要的所有控制器通用的方法。现在我的控制器继承自我构建的这个新的控制器类,而这个控制器类继承自基础控制器类。它运作良好,似乎很适合模型。

我的问题是 - 对于那些经常使用MVC的人来说,这是一个坏模式吗?采取这样一个中心阶级并且自己动手并使用它通常是一个糟糕的主意?

+0

描述你想要做将有助于人们理解这个问题更好 – gideon 2011-04-16 18:57:00

回答

1

这是受保护的,因为这些方法属于控制器代码内部。它们是专门用于控制器的控制器的扩展。他们受到保护的事实意味着,通过设计意图是在控制器中发生这种情况。以asp.net web表单为例,Page.IsPostback是为了从页面本身调用。 控制器通常应用于模型绑定魔法的位置,因此TryUpdateModel也属于此处。你可能会试图简化太多,但我明白你为什么要这么做。你能抽象一层吗?在您的控制器中使用tryupdatemodel,并在另一个“常用”方法中使用其他常见代码。
通常在控制器的mvc代码中保持相当简单,如果!TryUpdateModel(model),那么你只需返回并让modelstate/validators发挥他们的魔力。它是一种简单的方法,通常效果很好。通过尝试实现这种其他方法,您是否节省了2/3行通用验证代码?

我不知道如果(因为ModelState等)使用从控制器继承的另一个类,其目的不是真正的控制器 - 在任何情况下都可以工作 - 所以要小心。 ModelState中可能无法正确传来传去,等

+0

亚当什么一些基本的示例代码,这差不多就是我一直在寻找。你所说的话是有道理的。该方法不仅仅是一对线,而且根据不同的条件,它会使用不同的参数调用TryUpdateModel,以便方法调用需要保留在函数中。不过,你的建议非常好,并巩固了你的解释。我认为我最终采取的路线工作得很好,并且非常接近预期的模式。谢谢你的回答。 – KTF 2011-04-19 13:03:05

相关问题