我可以在 ASP.NET MVC3 中将自定义类设置为我的控制器的默认基类吗?

Posted

技术标签:

【中文标题】我可以在 ASP.NET MVC3 中将自定义类设置为我的控制器的默认基类吗?【英文标题】:Can I set a custom class as the default base class for my controllers in ASP.NET MVC3? 【发布时间】:2011-02-15 14:50:26 【问题描述】:

我想从我自己编写的自定义基类继承我的所有控制器。每次添加新控制器时我都可以更改该行,但如果我可以在某处指定在那里设置的默认值会更好。这样我就不用担心忘记这一点了,以后加入项目的其他人会更轻松。

有什么方法可以实现吗?

【问题讨论】:

这不是关于 MVC 恕我直言 - 你所说的是以某种方式定义一组类的默认基类。抱歉,这可以在 Python 和 Ruby 等动态语言中完成,但不能在 C# 中真正完成......当然,您可能可以模拟这样的行为,也许使用 DI 或反射。或者像 Rob West 那样使用一些范围解析技巧。 @rsenna 虽然无法在语言/编译器级别完成,但 ASP.NET MVC 提供了可定制的工具选项,使这成为可能。阅读我对问题的回答。 【参考方案1】:

您可以自定义调用添加控制器操作时使用的 T4 模板。基本上,您必须将模板从 C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplates\CSharp\Web\MVC 3\CodeTemplates\AddController\Controller.tt 复制到项目文件中的 '~\CodeTemplates\AddController\Controller.tt`。

更多信息here(向下滚动到“添加和自定义脚手架模板”)

【讨论】:

这将应用于所有 MVC 解决方案,这肯定不是一件好事! 好吧,如果您将Controller.tt 文件复制到您的项目中,它将仅适用于该单个项目。或者您可以在其原始位置修改文件,但是每个从事该项目的开发人员都必须修改他们机器的文件。将模板文件复制到项目中(虽然有时是重复的)是目前实现这一目标的最佳方式,同时支持多个开发人员、源代码管理等。 哇哦!有效!美丽的!这个模板功能正是我在旧 VS2008 中所缺少的! 实际上在 VS 2008 中也可以使用相同的技术。【参考方案2】:

您可以使用命名空间来做到这一点:在与控制器相同的命名空间中创建一个名为 Controller 的类,例如:

namespace UI.Controllers

    public class Controller : System.Web.Mvc.Controller
    
        //Code here
    

然后对 Controller 的标准非限定引用将引用您的基类,而不是 System.Web.Mvc.Controller 之一。

虽然可能会让人感到困惑 - 我宁愿只需要记住引用基类。

【讨论】:

确实,我也更喜欢给我的类命名,它们与框架类不冲突。【参考方案3】:

是的,这很容易做到。首先创建一个名为“BaseController”的类,例如它继承自 Controller。然后你所有的控制器都会继承自 BaseController。

编辑:我认为使用 T4 模板来生成你的服装控制器(称为 BaseController 或可能是控制器 - 任何你喜欢的)也可以工作。我见过 Scot Hanselman 在他的一次演讲中做了类似的事情。

【讨论】:

啊,我明白了,现在我读了你的回答,我更好地理解了这个问题。我的解决方案运行良好,但我不确定 Vilx 是否愿意实施我的解决方案或您的解决方案。但老实说,我通常尽量避免将我的类命名为类似于 .NET 框架(或在本例中为 ASP.NET MVC)本身中的类,这会造成很多混乱,甚至 Visual Studio 也会抱怨。 (注意:我刚刚编辑了我的帖子)

以上是关于我可以在 ASP.NET MVC3 中将自定义类设置为我的控制器的默认基类吗?的主要内容,如果未能解决你的问题,请参考以下文章

asp.net MVC3 上的自定义错误页面

ASP.Net MVC3:创建自定义 URL 而不包含确切的控制器名称

ASP.NET MVC3 - 自定义验证属性 -> 客户端损坏

ASP.NET MVC3:ValidationType ModelClientValidationRule

为啥我升级到 MVC3 后我的自定义 HtmlHelpers 停止工作?

在 ASP.NET MVC3 中正确使用 TempData?