Почему 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).

Другие вопросы по тегам