2

为什么 T4MVC 使用虚拟控制器方法?改变一个

public ActionResult Details (string Id)

到:

public virtual ActionResult Details (string Id)

我已经看到有关 T4MVC 的其他问题,但不明白为什么。

4

2 回答 2

3

通常,如果框架/库需要虚拟方法(另请参见 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 为什么以及出于什么目的创建这个生成的类。

于 2012-07-11T13:55:56.173 回答
0

我可以看到使它们虚拟化的唯一好处是允许开发人员在使用 T4MVC 助手的地方“转到实现/定义”。这是因为静态助手“MVC”上的控制器类型是基本控制器类型。

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

因此,在以下代码段中,Go to Definition on the Action Name 将转到 Base Implementation:

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

+1 David Ebbo 提供了如此直观的功能。当我意识到这一点时,我被震撼了!

PS:这不适用于通过部分函数添加的无参数操作,不幸的是它们导航到生成的代码。

于 2017-07-11T11:19:09.400 回答