为什么T4MVC引入虚拟控制器动作?

时间:2012-07-11 13:01:13

标签: asp.net-mvc-3 t4mvc

为什么T4MVC使用virtual作为控制器方法?改变

public ActionResult Details (string Id)

为:

public virtual ActionResult Details (string Id)

我已经看过关于T4MVC的other questions,但不明白为什么。

2 个答案:

答案 0 :(得分:3)

通常,如果框架/库需要虚拟方法(另请参见Nhibernate),则意味着某些地方/某些时候您的方法将被覆盖。

因此,T4MVC将您的操作方法标记为virtual,因为它会覆盖它们。

让我们拿一个简单的控制器:

public partial class HomeController : Controller
{
    public virtual ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";

        return View();
    }       
}

如果你转到HomeController.generated.cs下的生成T4MVC.tt,你会发现一个生成的类,它继承自你的控制器并覆盖你的动作方法:

[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class T4MVC_HomeController: MvcApplication8.Controllers.HomeController {
    public T4MVC_HomeController() : base(Dummy.Instance) { }

    public override System.Web.Mvc.ActionResult Index() {
        var callInfo = new T4MVC_ActionResult(Area, Name, ActionNames.Index);
        return callInfo;
    }

}

我没有使用过T4MVC所以我不知道T4MVC创建这个生成的类的原因和目的。

答案 1 :(得分:0)

我可以看到让它们成为虚拟的唯一好处是允许开发人员去实施/定义'使用T4MVC助手的地方。这是因为控制器的类型在静态助手' MVC'是基本控制器类型。

ModelState.Clear();

因此,在下面的代码片段中,Go to Definition on Action Name将转到Base Implementation:

public static partial class MVC
{
    public static HomeController Home = new T4MVC_HomeController();
}

+1 David Ebbo这样一个直观的功能。当我意识到这一点时,我心里一阵沮丧!

PS:这对于通过partial函数添加的无参数动作不起作用,相反,它们会导航到生成的代码。