2011-03-22 1 views
4

내 컨트롤러에서 데이터베이스 기능 (IUnitOfWork이 내 서비스 계층에 전달됨)에 대한 컨트롤러 작업에 사용되는 IUnitOfWork 개체 (IoC에서 생성 됨)를 전달합니다. 내보기 중 하나에서 T4MVC가 Html.ActionLink에서 컨트롤러 작업을 실행하려고하는 이유는 무엇입니까?

, 나는 /Company/View/<id>에 대한 링크를 제공 할, 그래서 나는 다음과 같은 전화 :

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

이것은 Company 컨트롤러에서하지만 다른에서보기에서하지 호출되는 제어 장치. 문제는 MVC.Company.View(company.Id)이 실제로 CompanyController.View(id) 메서드 자체를 호출하는 것으로 보입니다. 이것은 두 가지 이유로 나쁘다. CompanyController의 비 매개 변수가없는 생성자가 호출되지 않습니다 이후

1), 더 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))이 DB 호출을 트리거하지 않아야합니다. 과도한 데이터베이스 호출은 전혀 이득이되지 않습니다.

T4MVC가 이러한 방식으로 작동하도록 만들어진 이유가 있습니까?


편집

: 여기
내가 위의 코드와 함께이 문제를 repro 수 할 수 아니에요의 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; } 
} 
+2

실제로 귀하의 실제 작업은 호출되지 않아야합니다. 회사 컨트롤러의 모양과 조치 방법에 대한 자세한 내용을 제공해 주시겠습니까? impl 세부 사항은 필요 없지만 선언 만하면됩니다. –

+0

컨트롤러에 사용 된 컨트롤러, 생성자 및 동작 선언을 추가했습니다. 당신이 뭔가 다른 것을 알았다면 알려주세요. 나는 그것을 업데이트 할 것입니다. 감사! – KallDrexx

+0

조치에 메소드 이름이 누락되었습니다. 또한 MyCustomBaseController 및 해당 생성자를 포함 할 수 있습니까? 내 목표는 작은 응용 프로그램에서 볼 수있는 것을 재현 할 수있게하는 것입니다. –

답변

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'에서 'Go To Definition'을 시작하면 T4MVC.cs (T4MVC.tt 아래)가 열립니다.

+0

글쎄, 그건 짜증나. 분명히 CompanyController T4는 다시 생성되지 않았습니다. 왜냐하면'View()'가 거기에 없었기 때문에 다른 모든 액션이있었습니다.그것이 더 자동적 이었으면 좋겠다고 생각해라. 그러나 T4를 명백하게 다시 움직이는 것은 그것을 고정 시켰을 것 같다. 그리고 나는 더 이상의 충돌을 가지지 않고있다. 내 멍청이를 통해 나를 도와 주심에 감사드립니다. :) – KallDrexx

+0

T4MVC를 자동으로 실행하는 방법은 http://chirpy.codeplex.com/을 참조하십시오. –

+0

굉장해. JS 통합을 위해 전에 chirpy를 사용했지만 t4를 처리 할 수 ​​있는지 몰랐습니다. 감사! – KallDrexx