2012-07-11 68 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:这不适用于通过部分函数添加的无参数操作,而不幸的是它们导航到生成的代码。

相关问题