【问题标题】:Check viewbag null in javascript under razor code在剃须刀代码下检查javascript中的viewbag null
【发布时间】:2018-11-05 17:32:09
【问题描述】:

我将 null 传递给了代表类型列表视图包,但我试图理解为什么这条线

if ('@representativeTypesList' != null)

未正确评估,光标直接运行到下面视图的Html.Raw 部分。我相信我已经正确放置了@转义字符。任何帮助将不胜感激。

@{
    var representativeTypesList = @ViewBag.RepresentativeTypesList;
}

@section Header {

    <script type="text/javascript">

        if ('@representativeTypesList' != null)            
        {
            var array1 = '@Html.Raw(
                Json.Encode(
                    ((IEnumerable<RepresentativeTypesModelView>)ViewBag.RepresentativeTypesList).Select(item => new
                    {
                        itemValue = (item.Value == null ? "" : item.Value),
                        itemText = (item.Name == null ? "" : item.Name)
                    })
                )
            )';
            hdninput1 = $("#txtSalesReps_hdn");
            dropdown1 = $("#selSalesReps");
            dropdown1.append($("<option />").val('default').text('-- '@lbls.lblSelectOption' --'));
            if (array1.length > 0)
            {
                $.each(array1, function() {
                    dropdown1.append($("<option />").val(this.itemValue).text(this.itemText));
                });
            }
        }
    </script>
}

【问题讨论】:

  • if (@representativeTypesList != null)
  • 您正在将字符串 ''@representativeTypesList' 与 null 进行比较,所以它肯定会直接转到 html raw,尝试使条件像这样 ''@representativeTypesList' !=='null'
  • 嗨,很抱歉,representativeTypesList 包含对象 ModelView,而不是字符串。

标签: javascript c# razor model-view-controller


【解决方案1】:

可能会删除@representativeTypesList 两侧的刻度线,可能是它正在将字符串评估为非空,而不是将变量评估为空。

【讨论】:

  • 嗨,谢谢,但行为是一样的。还有其他线索吗?谢谢。
【解决方案2】:

Razor 仅用于创建初始标记。一旦页面被渲染(即,一旦您在客户端运行 javascript,而不是在服务器上准备它),'@representativeTypesList' 将被视为呈现时存在的硬编码字符串,不会被看到作为 javascript 变量。

相反,为什么不声明一个 javascript 变量并使用 Razor 设置其初始值:

var repTypesList = @representativeTypesList;
if (repTypesList !== null)  {
    ...
}

然后你可以在运行时更改值等。

【讨论】:

  • 嗨,我之前确实尝试过,但没有任何乐趣。即使我将 ViewData 放入控制器并将其设置为与该 if 语句中的值不同的值,光标也会完全跳过它。很奇怪。
【解决方案3】:

您可以简单地将 ViewBag 对象传递到代码中而不先将其转换为变量吗?除非有特定原因您需要这样做,否则这应该有效。正如 Elemental Pete 所说,Razor 仅用于创建初始标记。 Razor 永远不会发送到浏览器。它在服务器上处理。然后,它渲染 HTML、CSS、JS 代码中被告知要渲染的任何内容,然后将其发送到浏览器。然后浏览器运行 JS 代码。这样想你的代码,我会尝试替换

if ('@representativeTypesList' != null)

如果 (@ViewBag.RepresentativeTypesList != null)

希望有帮助!

杰森

【讨论】:

  • 嗨,我注意到如果我把它放在语句的顶部,它确实会被评估:@(ViewBag.RepresentativeTypesList != null ? haveEmpty = 0 : haveEmpty = 1)。但是,如果我在 if 语句中使用 haveEmpty,它就会被跳过。我认为线索是括号外的@ char,但是如果我在原始代码中这样做,请输入@if,它会混淆整个语句并出现错误,例如 IEnumerable 是在给定上下文中无效的类型或名称代表类型列表在给定的上下文中不存在。
【解决方案4】:

这里给出了解决方案Using Razor within JavaScript。因为我的代码在 js 部分中,所以需要用“文本”标签包围它。谢谢。

【讨论】:

    【解决方案5】:

    我刚刚在我的代码中尝试了以下内容,并且成功了。将此与您的代码进行比较。

    在控制器中:

    public ActionResult SomeMethod(int id)
    {
         ViewBag.RepresentativeTypesList = null;
    }
    

    在视图中:

    @{
        var representativeTypesList = ViewBag.RepresentativeTypesList;
    }
    
    @section Header {
        <script type="text/javascript">
    
            if ('@representativeTypesList' != null)
            {
                if (array1.length > 0)
                {
                    $.each(array1, function() {
                        dropdown1.append($("<option />").val(this.itemValue).text(this.itemText));
                    });
                }
            }
        </script>
    }
    

    我不得不修改 if 语句中的代码,因为我没有你拥有的一些对象,但是当我运行它时,它跳过了 if 语句并且没有运行任何它。

    如果您有任何问题,请告诉我!

    杰森

    此外,如果此问题或您在此处提出的任何问题的解决方案有效或提供帮助,请确保将答案标记为正确的答案,如果是您的问题,或者如果不是,但答案是有益的,请单击向上箭头指示它很有用。谢谢! :)

    【讨论】:

      猜你喜欢
      • 2018-03-01
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 2015-07-22
      相关资源
      最近更新 更多