8

ヘルパーでフラッシュ メッセージのTempDataにアクセスしたい(Ruby のように)

の実行時エラーが発生します

The name 'TempData' does not exist in the current context

私のFlash.cshtmlは次のとおりです

@helper Show() 
{
    var message = "test message";
    var className = "info";

    if (TempData["info"] != null)
    {
        message = TempData["info"].ToString();
        className = "info";
    }
    else if (TempData["warning"] != null)
    {
        message = TempData["warning"].ToString();
        className = "warning";
    }
    else if (TempData["error"] != null)
    {
        message = TempData["error"].ToString();
        className = "error";
    } 

    <script>
        $(document).ready(function () {
            $('#flash').html('@HttpUtility.HtmlEncode(message)');
            $('#flash').toggleClass('@className');
            $('#flash').slideDown('slow');
            $('#flash').click(function () { $('#flash').toggle('highlight') });
        });
    </script>
}

私が持っているレイアウトで

<section id="main">
    @Flash.Show() 
    <div id="flash" style="display: none"></div>
    @RenderBody()
</section>
4

4 に答える 4

13

ControllerBaseTempData はコントローラーの基本クラスであるクラスに属し、コントローラーが背後にない共有ビューにはアクセスできません。

考えられる回避策の 1 つは、コントローラーをヘルパー メソッドに渡すか、HtmlHelper を介してコントローラーにアクセスすることです。

@helper SomeHelper(HtmlHelper helper)
{
  helper.ViewContext.Controller.TempData
}
于 2012-01-06T18:43:54.397 に答える
0

データがリダイレクトされても存続できるようにするために、TempData を使用するものもあります。その場合は、最初にデータを TempData に割り当てることで問題を解決できます。

TempData["myStuff"] = myData;

次に、新しいリダイレクトされたアクション内で:

ViewBag["myBaggedStuff"] = TempData["myStuff"];

次に、共有ビューで ViewBag を使用します。

于 2013-12-20T16:22:47.100 に答える
0

またはTempDataを本当に使用したい場所で使用しているようです。ViewBagViewData["key"]

コントローラ

ViewBag.info=someString;
return View(model);

意見

if (ViewBag.info != null)
{
    message = ViewBag.info;
    className = "info";
}

この記事をチェックしてください: http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx

于 2012-01-06T18:41:54.973 に答える