asp.net-mvc – 为什么T4MVC尝试从Html.ActionLink运行控制器操作?

在我的控制器中,我传入一个IUnitOfWork对象(由IoC生成),然后在控制器操作中用于数据库功能(IUnitOfWork传递给我的服务层).

在我的一个观点中,我想提供一个指向/ Company / View /< id>的链接,因此我调用以下内容:

<li>@Html.ActionLink(company.Name, MVC.Company.View(company.Id))</li>

这不是从公司控制器调用,而是从不同控制器中的视图调用.问题似乎是MVC.Company.View(company.Id)似乎实际上是在调用CompanyController.View(id)方法本身.这有两个原因.

1)由于从不调用CompanyController的非参数构造函数,因此不存在UnitOfWork,因此当调用View(int id)操作时,操作的数据库调用将失败并显示NullReferenceException.

2)即使IUnitOfWork存在,我的视图也不应该触发数据库调用,因此我的链接就会生成. Html.ActionLink(company.Name,“View”,new {id = company.Id})不会触发任何数据库调用(因为没有调用action方法)所以就我而言tml.ActionLink( company.Name,MVC.Company.View(company.Id))也不应该触发任何数据库调用.这是过多的数据库调用,绝对没有收获.

是否有任何理由创建T4MVC以这种方式运行?

编辑:以下是CompanyController的声明

public partial class CompanyController : MyCustomBaseController
{
    public CompanyController(IUnitOfWork unitOfWork)
    {
    }

    public virtual ActionResult Add(int jobSearchId)
    {
    }

    public virtual ActionResult Edit(int id)
    {
    }

    [HttpPost]
    public virtual ActionResult Edit(Company company, int jobSearchId)
    {
    }

    public virtual ActionResult View(int id)
    {
    }
}

public class MyCustomBaseController: Controller
{
    public MyCustomBaseController()
    {
    }

    public int CurrentUserId { get; set; }
}

最佳答案 奇怪,我无法用上面的代码重现这个问题.应该发生的是调用MVC.Company.View(company.Id)最终调用你的action方法的覆盖,并且从不实际调用你的实际操作方法.

为了使这项工作,生成的代码应如下所示(仅保留相关内容):

public static class MVC {
    public static Mvc3Application.Controllers.CompanyController Company = new Mvc3Application.Controllers.T4MVC_CompanyController();
}

public class T4MVC_CompanyController: Mvc3Application.Controllers.CompanyController {
    public T4MVC_CompanyController() : base(Dummy.Instance) { }

    public override System.Web.Mvc.ActionResult View(int id) {
        var callInfo = new T4MVC_ActionResult(Area, Name, ActionNames.View);
        callInfo.RouteValueDictionary.Add("id", id);
        return callInfo;
    }
}

您能看一下生成的代码,看看它是否有所不同?首先在’MVC’上进行’Go To Definition’,这将打开T4MVC.cs(在T4MVC.tt下).

点赞