Почему T4MVC пытается запустить действия контроллера из Html.ActionLink?
В моих контроллерах я передаю в 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)
сам метод. Это плохо по 2 причинам.
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; }
}
1 ответ
Странно, я не могу воспроизвести эту проблему с кодом выше. Что должно произойти, так это то, что вызов 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).