2

私はmvcを初めて使用し、ViewBagをコントローラーのメソッドに次のようにロードします。

HomeController: Controller
{
    Public ActionResult Index()
    {
        loadViewBag();
        return View();
    }

    public void loadViewBag()
    {
      ViewBag.aaa = "something";
    }
}

それは正常に動作します。

私の問題は何ですか、今度は別のコントローラー(アカウントなど)からloadViewBag()メソッドを呼び出して、同じメソッドを再利用し、次のようにいくつかの静的変数のためにloadViewBag()メソッドを静的にする必要があります public static void loadViewBag() 。 static、ViewBag にエラーが表示される "非静的フィールド、メソッド、またはプロパティ 'System.Web.Mvc.ControllerBase.ViewBag.get' にはオブジェクト参照が必要です"。

解決策/提案はありますか。

ありがとうございました。

4

3 に答える 3

10

ControllerBase の拡張メソッドにするだけです。

public static void ControllerExt
{
    public static void LoadViewBag(this ControllerBase controller)
    {
        controller.ViewBag.aaa = "something";
        ...
    }
}

そうすれば、どのコントローラーでも使用できます

public class HomeController : Controller
{
    public ActionResult Index()
    {
        this.LoadViewBag();
        return View();
    }
}

public class AccountController : Controller
{
    public ActionResult Index()
    {
        this.LoadViewBag();
        return View();
    }
}

一部のコントローラーにのみ固有の場合は、ViewBag プロパティを渡す方がより柔軟です。

public static class ControllerHelper
{
    public static void LoadViewBag(dynamic viewBag)
    {
         viewBag.aaa = "something";
    }
}

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ControllerHelper.LoadViewBag(ViewBag);
        return View();
    }
}
于 2013-09-13T10:03:50.040 に答える
4

ViewBagはコントローラー (より具体的にはControllerBase) のプロパティであり、静的メソッドはクラス インスタンスを認識していないため、アクセスできません。

静的メソッドを使用したり、拡張メソッドにしたりする場合は、コントローラー インスタンスをメソッドに渡すことができますが、問題によっては、このソリューションは最適ではない可能性があります。質問に詳細を追加すると、より良い回答が得られる場合があります。

Public ActionResult Index()
{
    this.loadViewBag();
    return View();
}

public static void loadViewBag(this ControllerBase target)
{
    target.ViewBag.aaa = "something";
}
于 2013-09-13T10:00:37.473 に答える