为什么T4MVC使用virtual作为控制器方法?改变
public ActionResult Details (string Id)
为:
public virtual ActionResult Details (string Id)
我已经看过关于T4MVC的other questions,但不明白为什么。
答案 0 :(得分:3)
通常,如果框架/库需要虚拟方法(另请参见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创建这个生成的类的原因和目的。
答案 1 :(得分:0)
我可以看到让它们成为虚拟的唯一好处是允许开发人员去实施/定义'使用T4MVC助手的地方。这是因为控制器的类型在静态助手' MVC'是基本控制器类型。
ModelState.Clear();
因此,在下面的代码片段中,Go to Definition on Action Name将转到Base Implementation:
public static partial class MVC
{
public static HomeController Home = new T4MVC_HomeController();
}
+1 David Ebbo这样一个直观的功能。当我意识到这一点时,我心里一阵沮丧!
PS:这对于通过partial函数添加的无参数动作不起作用,相反,它们会导航到生成的代码。