爲什麼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