名称<js_variable>在当前上下文</js_variable>中不存在

时间:2014-05-29 17:52:01

标签: javascript asp.net razor

我设置了以下模型,其中有List<string>我想要为其添加值:

public class NewShipmentModel
{
    ...
    public List<string> units_selected { get; set; }

    public NewShipmentModel()
    {
        units_selected = new List<string>();
    }
}

在我的视图中,我在复选框上设置了一个EventListener,我试图获取该复选框的值,并使用Javascript和Razor从该列表中添加或删除它:

    for (var i = 0; i < unitCheckboxes.length; i++) {
        unitCheckboxes[i].addEventListener("change", function () {

            var addition = 0;
            var unit_serial = this.value;
            var curr_val = (this.name == "Base") ? parseInt($("#total-bases-selected").text()) : parseInt($("#total-clients-selected").text());

            if (this.checked) {
                addition = 1;
                @Model.units_selected.Add(unit_serial);  // ERROR HERE
            }  else {
                addition = -1;
                @Model.units_selected.Remove(unit_serial);  // ERROR HERE
            }

            curr_val = curr_val + addition;

            if (this.name == "Base")
                $("#total-bases-selected").text(curr_val);
            else
                $("#total-clients-selected").text(curr_val);

        }, false);
    }

但是,在评论中标记为ERROR HERE的地方,实际上尝试添加或删除值失败了。问题是它无法访问unit_serial,因为它似乎超出了Razor的范围:

The name unit_serial does not exist in the current context

如何正确访问变量?这可能吗?


编辑:请注意,数据当前通过submit按钮和HTTP POST传回控制器。我不确定如何填充此列表和/或在表单的其余部分注入数据。

1 个答案:

答案 0 :(得分:1)

它会让你感到困惑的是服务器和客户端代码混乱。 Razor部分总是在服务器上执行。 Javascript - 在客户端上。因此,您无法做到

//note that unit_serial doesn't exist when you're calling Add method because it
//executes during razor view generation on server.
//all javascript code executes after the client receive generated view.
@Model.units_selected.Add(unit_serial); 

在javascript代码中间,因为它没有意义。当更改事件处理程序触发复选框时:您将把它发送到服务器进行更新。

为了使其工作,请考虑再创建一个mvc操作并使用ajax将数据传递给服务器。