【问题标题】:use TempData in a Helper error: The name 'TempData' does not exist in the current context在 Helper 错误中使用 TempData:名称“TempData”在当前上下文中不存在
【发布时间】:2016-03-12 14:31:55
【问题描述】:

我想在我的助手中访问 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>

【问题讨论】:

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


    【解决方案1】:

    TempData 属于ControllerBase 类,它是控制器的基类,它不能被没有控制器的共享视图访问,

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

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

    【讨论】:

    • 我可以使用这个答案来做同样的事情,虽然不是在帮助者stackoverflow.com/a/5582533/31470谢谢
    • Nonononono 请不要将 -controller- 传递给 -view-。您如何设置一个过滤器,自动将 TempData 推送到视图包中?或者使用控制器基类中的 OnActionExecut{ing,ed} 方法用数据填充 viewbag。从视图中直接戳控制器方法/字段/ foo 几乎破坏了封装。两个例子的区别在于链接的解决方案不使用视图中的控制器。
    • 您现在可以使用 helper.ViewContext.TempData。
    【解决方案2】:

    只需将 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.
    }
    

    【讨论】:

      【解决方案3】:

      看起来您正在使用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

      【讨论】:

        【解决方案4】:

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

        TempData["myStuff"] = myData;
        

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

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

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

        【讨论】:

          猜你喜欢
          • 2015-11-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-01
          • 2010-12-17
          相关资源
          最近更新 更多