【问题标题】:using viewbag with jquery - asp.net mvc 3使用带有 jquery 的 viewbag - asp.net mvc 3
【发布时间】:2011-10-26 15:42:52
【问题描述】:

我在控制器中将 ViewBag.IsLocal 设置为 true。我想使用 jquery 检查 ViewBag 值并显示警报。

代码:

if(@ViewBag.IsLocal == true)
{
alert("yeah");
}

我从来没有收到警报。当我使用 Firebug 查看 ViewBag 的值时,它是 True(大写 T)。我必须做类似 == 'True' 的事情吗?我尝试了所有方法,但都没有奏效。

感谢您的帮助。

H

【问题讨论】:

  • 如何将 ViewBag 暴露给 javascript?
  • 我想我不会。我尝试做类似 var isLocal = ViewBag.IsLocal;然后执行 if(isLocal == true) 但这也不起作用
  • 您似乎混淆了服务器端代码和客户端代码。您的控制器在网络服务器上运行,javascript(包括 jQuery)在浏览器中运行。

标签: jquery asp.net-mvc-3 viewbag


【解决方案1】:

假设您已在控制器操作中将 IsLocal 属性设置为布尔值:

public ActionResult Index()
{
    ViewBag.IsLocal = true;
    return View();
}

您可以在视图上执行此操作:

<script type="text/javascript">
    @if(ViewBag.IsLocal)
    {
        <text>alert("yeah");</text>
    }
</script>

请不要使用 ViewBag/ViewData。使用视图模型和强类型视图。

所以这是我更喜欢的一种更好的方法。您可以 JSON 将您的视图模型序列化为 javascript 变量,然后对其进行处理。像这样:

@model MyViewModel

<script type="text/javascript">
    var model = @Html.Raw(Json.Encode(Model));
    // at this stage model is a javascript variable containing
    // your server side view model so you could manipulate it as you wish
    if(model.IsLocal)
    {
        alert("hello " + model.FirstName);
    }
</script>

显然,如果您不需要整个视图模型,您可以 JSON 仅序列化其中的一个子集 => 仅对客户端脚本需要的部分进行序列化。

【讨论】:

  • 如果他做的事情比 alert() 的例子更复杂,将服务器端 Razor 条件混合到他的 JavaScript 中将是一个非常糟糕的主意。
  • @DaveWard,在这种情况下,他需要使用服务器端变量来包含或不包含给定脚本。整个脚本主体可以包装在 节点中,以便被视为文字。在脚本内部不应该有更多的混合。我同意你的看法,最好将脚本外部化到一个单独的 javascript 文件中。在这种情况下,这个&lt;script&gt; 标记可以使用与我在答案中显示的相同语法有条件地包含(包装在 节点中,这在 Razor 中具有特殊含义)
  • 您假设他正在使用该变量来包含脚本。他没有在问题中这么说。如果他需要在某个时候测试 IsLocal 客户端条件怎么办?或者,做任何比 if IsLocal then alert() 更简单的事情,真的吗? IMO,尝试从服务器端驱动这种交互是没有意义的,当您可以从客户端轻松地进行交互时(并且更清洁,没有&lt;text&gt; 混乱)并获得更大的灵活性。
  • @DaveWard,是 if('@ViewBag.IsLocal' == 'True') 为你赢得了我的反对票。您谈到不要混合服务器端和客户端变量,但这就是您的建议。
  • 我试图直接回答这个人的实际问题。他这么亲近,为什么要让答案过于复杂而对他隐瞒?
【解决方案2】:

如果您在呈现的页面上查看源代码,将插入什么来代替您的剃刀块?如果IsLocal 是布尔类型,我想你会看到:

@if(True == true)
{
  alert("yeah");
}

这样做的原因是因为true.ToString()True

在这种情况下,您需要在此处进行字符串比较:

if('@ViewBag.IsLocal' == 'True')
{
  alert("yeah");
}

【讨论】:

  • 您的两个代码 sn-ps 都不起作用。 .NET 中没有定义 alert 函数。您需要告诉 Razor 解释器不要将其解释为服务器端代码并​​将其视为文字。
  • 当然第一个不行。它不应该是工作代码的示例。你有没有看我的回答?
  • ya 这个答案比 OP 更混乱,它进一步模糊了 JS 和 C# 之间的界限
  • 如果他试图用 JavaScript 做任何严肃的事情,那么尝试使用 Razor 的条件而不是将值放入呈现的代码并让 JavaScript 处理它将是一场灾难。您必须以一种或另一种方式模糊这条线;不妨在正确的方向模糊它。
  • 你没有抓住重点,你还是错了。有关客户端/服务器代码的正确分离,请参阅 Darin 的答案。
【解决方案3】:

您可以使用以下功能

function parseBoolean(str)
{ 
   return /^true$/i.test(str);
}

并将其用作

if(parseBoolean('@ViewBag.IsLocal') == true) 
{ 
   alert("yeah");
}

【讨论】:

  • 不想使用疯狂的 HTML 来突出显示您的代码,请使用 4 个空格。检查我的编辑。
  • 感谢 j0k,我将在我进一步的问题和答案中考虑这一点。
猜你喜欢
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多