2011-03-22 54 views
4

在我的控制器中,我傳入一個IUnitOfWork對象(由IoC生成),然後用於數據庫功能的控制器操作(將IUnitOfWork傳遞給我的服務層)。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)方法本身。這有兩個原因是不好的。

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; } 
} 
+2

你實際上的行爲永遠不會被調用。您能否提供關於您公司控制器的外觀和操作方法的更多細節?我不需要impl的細節,只需要聲明。 – 2011-03-22 06:53:50

+0

我已經添加了在此使用的控制器,構造函數和動作聲明。如果你的意思是別的,請告訴我,我會更新它。謝謝! – KallDrexx 2011-03-22 12:28:02

+0

似乎您錯過了操作中的方法名稱。另外,你可以包含MyCustomBaseController及其構造函數嗎?我的目標是能夠複製您在小應用中看到的內容。 – 2011-03-22 15:09:55

回答

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 2011-03-23 01:33:03

+0

您可能想要查看http://chirpy.codeplex.com/一種方式來自動運行T4MVC。 – 2011-03-23 19:22:23

+0

哦真棒。我之前用JS進行JS整合,但不知道它可以處理T4。謝謝! – KallDrexx 2011-03-23 19:41:37

相關問題