Asp.net mvc 3 为什么T4MVC为控制器操作引入虚拟控制器?

Asp.net mvc 3 为什么T4MVC为控制器操作引入虚拟控制器?,asp.net-mvc-3,t4mvc,Asp.net Mvc 3,T4mvc,为什么T4MVC使用控制器方法?换衣服 public ActionResult Details (string Id) 致: 我已经看过T4MVC,但不明白为什么。通常,如果框架/库需要虚拟方法(另请参见Nhibernate),这意味着您的方法将被覆盖 因此T4MVC将您的操作方法标记为virtual,因为它会覆盖它们 让我们看一个简单的控制器: public partial class HomeController : Controller { public virtual Acti

为什么T4MVC使用控制器方法?换衣服

public ActionResult Details (string Id)
致:


我已经看过T4MVC,但不明白为什么。

通常,如果框架/库需要虚拟方法(另请参见Nhibernate),这意味着您的方法将被覆盖

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

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

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

        return View();
    }       
}
如果转到
T4MVC.tt
下的generated
HomeController.generated.cs
,您将发现一个生成的类,该类继承自您的控制器并重写您的操作方法:

[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创建这个生成的类的原因和目的

使它们虚拟化的唯一好处是允许开发人员在使用T4MVC助手的地方“转到实现/定义”。这是因为静态助手“MVC”上的控制器类型是基本控制器类型

public static partial class MVC
{
    public static HomeController Home = new T4MVC_HomeController();
}
因此,在以下代码段中,转到操作名称上的定义将转到基本实现:

@Url.Action(MVC.Home.Index())
+1 David Ebbo提供了如此直观的功能。当我意识到这一点时,我简直是疯了

PS:这不适用于通过分部函数添加的无参数操作,不幸的是,它们导航到生成的代码

@Url.Action(MVC.Home.Index())