4

私のコントローラーIUnitOfWorkでは、データベース機能のコントローラー アクションで使用されるオブジェクト (IoC から生成される) を渡します (IUnitOfWorkサービス レイヤーに渡されます)。

私のビューの 1 つで、 へのリンクを提供したい/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))DB 呼び出しもトリガーしないようにする必要があります。それは、絶対に得られない過度のデータベース呼び出しです。

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; }
}
4

1 に答える 1

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」で「定義に移動」を実行することから始めます。これにより、T4MVC.cs (T4MVC.tt の下) が開きます。

于 2011-03-22T23:38:29.467 に答える