为什么 T4MVC 使用虚拟控制器方法?改变一个
public ActionResult Details (string Id)
到:
public virtual 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();
}
}
如果你去生成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 为什么以及出于什么目的创建这个生成的类。
我可以看到使它们虚拟化的唯一好处是允许开发人员在使用 T4MVC 助手的地方“转到实现/定义”。这是因为静态助手“MVC”上的控制器类型是基本控制器类型。
public static partial class MVC
{
public static HomeController Home = new T4MVC_HomeController();
}
因此,在以下代码段中,Go to Definition on the Action Name 将转到 Base Implementation:
@Url.Action(MVC.Home.Index())
+1 David Ebbo 提供了如此直观的功能。当我意识到这一点时,我被震撼了!
PS:这不适用于通过部分函数添加的无参数操作,不幸的是它们导航到生成的代码。