【问题标题】:Why is TryUpdateModel on the Controller class in MVC protected?为什么 MVC 中 Controller 类上的 TryUpdateModel 受保护?
【发布时间】:2011-08-07 00:30:28
【问题描述】:

最初这将是一个询问如何执行任务的问题,但现在它变成了一个最佳实践问题。

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

所以我想知道,为什么这个方法受到保护?当然,我一定遗漏了一些明显的东西。 (请务必阐明)

我最终创建了自己的控制器类,该类继承自基本控制器类。这个新类包含我需要与所有控制器通用的方法。现在我的控制器继承自我构建的这个新控制器类,它又继承自基本控制器类。它运作良好,似乎非常适合模型。

我的问题是——对于那些经常使用 MVC 的人来说,这种模型是不是坏主意?采用这样的中心类并自己制作并使用它通常不是一个坏主意吗?

【问题讨论】:

  • 一些描述您正在尝试做的事情的基本示例代码将帮助人们更好地理解问题

标签: model-view-controller asp.net-mvc-3 controller


【解决方案1】:

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

我不确定(由于 ModelState 等)是否使用从控制器继承的另一个类,其目的不是真正的控制器 - 在所有情况下都可以工作 - 所以要小心。 ModelState 可能无法正确传递,等等。

【讨论】:

  • 亚当,这正是我想要的。你说的很有道理。该方法不仅仅是几行代码,而且根据不同的条件,它会使用不同的参数调用 TryUpdateModel,因此方法调用需要保留在函数内。但是,您的建议非常好,巩固了您的解释。我认为我最终采取的路线运作良好,并且非常接近预期的模式。谢谢你的回答。
猜你喜欢
  • 2011-08-04
  • 2011-10-02
  • 2015-05-02
  • 2011-04-21
  • 2013-10-01
  • 1970-01-01
  • 2014-05-16
相关资源
最近更新 更多