如何正确地将javascript与razor语法结合起来



我的剃刀视图中有以下代码,我需要设置一些javascript变量来设置来自剃刀的值。

但是,未设置变量的值。

var listPuntos =[];
    function onSelect(e) {
        var dataItem = this.dataSource.view()[e.item.index()];
        @{
            var proveedorID = 0;
            <text>proveedorID = dataItem.ProveedorID</text>
            var list = new UnitOfWork().PuntosVentaProveedorRepository.Get().Where(x => x.ProveedorID == proveedorID);
            proveedorID = 0;
            <text>listPuntos = list; </text>;
            <text>
                var displayText;
                $.each(listPuntos, function (key, value) {
                    if (displayText == undefined)
                        displayText = value.Nombre + ', ';
                    else
                        displayText = displayText + value.Nombre + ', ';
                });
                document.getElementById("puntos").value = displayText.slice(0,-2);
            </text>
        }
    }

鉴于您的具体示例,我将首先减少所需的<text>块的数量,而不是用 @{ … } 包装较的 C# 位。这提高了可读性并减少了混乱。例如:

var listPuntos =[];
    function onSelect(e) {
        var dataItem = this.dataSource.view()[e.item.index()];
        @{ var proveedorID = 0; }
        proveedorID = dataItem.ProveedorID;
        @{ var list = new UnitOfWork().PuntosVentaProveedorRepository.Get().Where(x => x.ProveedorID == proveedorID); }
        proveedorID = 0;
        listPuntos = @Json.Encode(list);
        var displayText;
        $.each(listPuntos, function (key, value) {
            if (displayText == undefined)
                displayText = value.Nombre + ', ';
            else
                displayText = displayText + value.Nombre + ', ';
        });
        document.getElementById("puntos").value = displayText.slice(0,-2);
    }

接下来,要将 C# 值注入服务器发出的 JavaScript 代码中,您需要在 JavaScript 中对该值进行编码。最好的方法是将其转换为 JSON。这是在上面使用 Json.Encode 完成的。特别是,行内容如下:

        listPuntos = @Json.Encode(list);

我已经用过Json.Encode但当然你可以自由使用任何适合你项目的JSON库。

你应该将HTML代码和JavaScript代码分开。首先,不要在加载 View 时从 View 调用任何服务器代码。通过模型属性以适当的格式(即 json 格式)推送所有必要的数组等,然后从该属性的值填充任何客户端列表。其次 - 像它一样移动代码:

        var displayText;
        $.each(listPuntos, function (key, value) {
            if (displayText == undefined)
                displayText = value.Nombre + ', ';
            else
                displayText = displayText + value.Nombre + ', ';
        });
        document.getElementById("puntos").value = displayText.slice(0,-2);

到适当的部分,喜欢它:

@section scripts
{
    <script>
.....
    </script>
}

最新更新