【问题标题】:Pass the ViewBag as a Paramerter将 ViewBag 作为参数传递
【发布时间】:2011-12-08 06:14:29
【问题描述】:

如果我在动态ViewBag 中有一个值,为什么我不能将它传递给一个方法?所以为了简单起见,假设我有ViewBag.SomeValue,并且我想将ViewBag.SomeValue 传递给HTML Helper。如果 HTML 助手接受动态作为变量,为什么不接受我的ViewBag.SomeValue

@Html.SimpleHelper(ViewBag.SomeValue)

public static string SimpleHelper(this HtmlHelper html, dynamic dynamicString)
{
    return string.Format("This is my dynamic string: {0}", dynamicString);
}

【问题讨论】:

  • 你能显示一些代码吗?我在aspx模板和助手中使用动态,看起来没有问题。
  • 我刚刚编辑了答案并添加了代码。

标签: c# asp.net-mvc asp.net-mvc-3 c#-4.0


【解决方案1】:

正如错误消息告诉您的那样,扩展方法不能动态分派。 .NET 不支持它。它与 ASP.NET MVC 或 Razor 无关。尝试为接受动态参数的某种类型编写扩展方法,然后尝试调用此扩展方法并传递给它一个动态变量,您将收到编译时错误。

考虑以下说明这一点的控制台应用程序示例:

public static class Extensions
{
    public static void Foo(this object o, dynamic x)
    {
    }
}

class Program
{
    static void Main()
    {
        dynamic x = "abc";
        new object().Foo(x); // Compile time error here
    }
}

所以你需要投射:

@Html.SimpleHelper((string)ViewBag.SomeValue)

实际上,正如 Adam 所说,您需要使用强类型视图模型,而永远不要使用 ViewBag。这只是不应使用 ViewBag 的数百万个原因之一。

【讨论】:

  • 你仍然可以通过 helper.ViewContext.Controller.ViewBag 来引用它,虽然没有?
  • 否,通过返回(字符串)helper.ViewData["Title"];
【解决方案2】:

更重要的是,因为 ViewBag 使用魔术字符串作为 viewbag 上的属性有点不好 - 你想发送什么给它。也许有更好的方法?您应该能够使用帮助程序实例通过以下方式引用它:

helper.ViewContext.Controller.ViewBag

但我不是使用 ViewBag 的人,除了 Title http://completedevelopment.blogspot.com/2011/12/stop-using-viewbag-in-most-places.html

【讨论】:

  • 我更喜欢使用强类型模型并将模型传递给助手。但是,假设您想将标题(在本例中为 ViewBag.SomeValue)传递给 html 帮助程序。现在您可以声明一个字符串并使其等于 Viewbag,然后将字符串传递给帮助程序。但这只会使标记更加混乱。我已经编辑了上面的代码,以向您展示我想要实现的更多目标。
  • 如果您选择这样做,我很确定我上面的回答会针对您的具体情况提供修复。
  • +1 - 读完这篇文章后,我意识到我要做一些愚蠢的事情。你救了我:)
  • @AdamTuliper-MSFT 我不确定这是否是一种不好的做法。例如,如果您有一个大的查询字符串值要从控制器传回以用于显示目的,那么这很好,因为该信息已经可供用户使用?
  • 我宁愿说永远不要使用它。在这种情况下,为什么不在视图模型中添加一些东西呢?然后,您始终知道进入视图的所有数据。任何 ViewData 都是脆弱的实现,不利于重构等。
【解决方案3】:

我知道这是一个较老的问题,但是当我搜索此问题时,我遇到了这个问题。

很容易将 ViewBag 作为参数传递,只需将其列为方法中的动态即可。例如,这里是我如何将 ViewBag 传递到我的帮助类之一以进行列排序。

public static IEnumerable<Models.MyViewModel> MyMethod(IEnumerable<Models.MyViewModel> model, string sortOrder, dynamic ViewBag)

【讨论】:

    猜你喜欢
    • 2021-09-08
    • 2015-07-16
    • 1970-01-01
    • 2019-03-26
    • 2020-09-18
    • 2015-05-24
    • 2012-11-10
    • 2020-10-30
    相关资源
    最近更新 更多