4

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

在我的一种观点中,我想给出一个链接/Company/View/<id>,所以我调用以下内容:

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

这不是从Company控制器调用的,而是从不同控制器中的视图调用的。问题似乎是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 })不会触发任何数据库调用(因为没有调用操作方法),所以就我而言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; }
}
4

1 回答 1

2

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

为了使它工作,生成的代码应该是这样的(只保留相关的东西):

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”上执行“转到定义”,这将打开 T4MVC.cs(在 T4MVC.tt 下)。

于 2011-03-22T23:38:29.467 回答