在Helper中使用TempData错误:当前上下文中不存在名称“TempData”

时间:2012-01-06 18:35:53

标签: asp.net-mvc asp.net-mvc-3 html-helper view-helpers

我想在我的助手中访问 TempData 以获取flash消息(例如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 个答案:

答案 0 :(得分:13)

TempData属于ControllerBase类,它是控制器的基类,共享视图无法访问,后面没有控制器,

一种可能的解决方法是将控制器传递给助手方法或通过HtmlHelper访问它。

@helper SomeHelper(HtmlHelper helper)
{
  helper.ViewContext.Controller.TempData
}

答案 1 :(得分:4)

只需将 TempData 传递给您的助手。

布局中对助手的调用将如下所示。

@Flash.Show(TempData)

你的Flash.cshtml帮助器将如下所示。

@helper Show(System.Web.Mvc.TempDataDictionary tempData)
{
    // The contents are identical to the OP's code,
    // except change all instances of TempData to tempData.
}

答案 2 :(得分: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

答案 3 :(得分:0)

有些人还使用TempData来帮助数据在重定向中存活。如果是这种情况,您可以先将数据分配给TempData来解决问题:

TempData["myStuff"] = myData;

然后在新的重定向操作中:

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

然后在共享视图中使用ViewBag。