为什么T4MVC将virtual用于控制器方法?更改为什么T4MVC为控制器操作引入虚拟?
public ActionResult Details (string Id)
到:
public virtual ActionResult Details (string Id)
我已经看到other questions约T4MVC但不明白为什么。
为什么T4MVC将virtual用于控制器方法?更改为什么T4MVC为控制器操作引入虚拟?
public ActionResult Details (string Id)
到:
public virtual ActionResult Details (string Id)
我已经看到other questions约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帮助程序进入“实现/定义”。这是可行的,因为控制器在静态Helper'MVC'上的类型是基本控制器类型。
public static partial class MVC
{
public static HomeController Home = new T4MVC_HomeController();
}
所以在下面的代码片段,请转至操作名称定义会去基本实现:
@Url.Action(MVC.Home.Index())
+1大卫博这样一个直观的特点。当我意识到这一点的时候,我感到头晕!
PS:这不适用于通过部分函数添加的无参数操作,而不幸的是它们导航到生成的代码。
感谢您的答案,我也将看看NHibernate。 – pdjota 2012-07-11 17:46:09