2012-07-11 32 views

回答

2

通常如果一個框架/庫需要虛擬方法(參見Nhibernate),它意味着某處/某個時候您的方法將被覆蓋。

因此,T4MVC會將您的操作方法標記爲virtual,因爲它會覆蓋它們。

讓我們來簡單的控制器:

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

     return View(); 
    }  
} 

如果你去產生HomeController.generated.csT4MVC.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創建了這個生成的類。

+0

感謝您的答案,我也將看看NHibernate。 – pdjota 2012-07-11 17:46:09

0

我可以看到讓他們變得虛擬的唯一好處是允許開發人員使用T4MVC幫助程序進入「實現/定義」。這是可行的,因爲控制器在靜態Helper'MVC'上的類型是基本控制器類型。

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

所以在下面的代碼片段,請轉至操作名稱定義會去基本實現:

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

+1大衛博這樣一個直觀的特點。當我意識到這一點的時候,我感到頭暈!

PS:這不適用於通過部分函數添加的無參數操作,而不幸的是它們導航到生成的代碼。

相關問題