在我的控制器中,我传入一个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 })
不会触发任何数据库调用(因为没有调用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; }
}
答案 0 :(得分:2)
奇怪,我无法使用上面的代码重现此问题。应该发生的是调用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下)。