如何使用Razor在javascript块变量中使用C#变量?

时间:2011-09-30 10:02:09

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

我有一个视图文件(.cshtml),文件顶部有这个C#块:

@{
List<string> selectedCategories = new List<string>();

}

我想在以下javascript块中使用selectedCategories列表

@section scripts{
<script src="../../Scripts/jquery-1.6.4-vsdoc.js" type="text/javascript"></script>
<script type="text/javascript">
    $(document).ready(function () {
        $("#list-all-categories").selectable({
            stop: function () {
                var result = $("#selectedCategories").empty();
                @selectedCategories.Clear()
                $(".ui-selected", this).each(function () {
                    var Mytext = $(this).text();

                    @selectedCategories.Add(Mytext.toString());

                });

            }
        });
    });
</script>

}

所以,它不起作用!......根本就没有了!

我有一些这样的错误: - 关闭了条件编译 - 当前上下文中不存在名称“Mytext” -...

我该怎么办?! 请帮帮我!

3 个答案:

答案 0 :(得分:5)

  • Javascript在浏览器中运行。
  • Razor代码在网络服务器中运行

你不能那样混合它们。

您需要仅使用jQuery创建表单元素,然后将它们发送回sevrer。

<script type="text/javascript">
    $(document).ready(function () {
        $("#list-all-categories").selectable({
            stop: function () {
                $(".selectedItems").remove();
                $(".ui-selected", this).each(function () {
                var Mytext = $(this).text();
                $('#myform').append('<input type="hidden" name="selectedCategory" value="' + MyText + '" class="selectedItems" />');
            });
        });
    });
</script>

将“myform”更改为已发布的表单。

然后你得到的项目为:

public ActionResult YourAction(string[] selectedCategory)
{
}

答案 1 :(得分:1)

问题是在网页到达Web浏览器之前,剃须刀表达式是在服务器端编译的。但JavaScript在客户端的“运行时”被解释。因此,您无法像这样从JavaScript向c#-list添加内容。

也许,如果你需要在后端维护一个c#-list,你可以在控制器上做一个你可以通过Ajax发送项目的动作。

答案 2 :(得分:1)

Razor代码由Web服务器运行,因为它是构建文本,此时Javascript只是纯文本。

Razor只是让这些东西更容易阅读,但实际上它只是将服务器执行与字符串文本块结合起来。

你的例子实际上是这样做的:

Response.Write(@"
<script src=""../../Scripts/jquery-1.6.4-vsdoc.js"" type=""text/javascript""></script>
<script type=""text/javascript"">
$(document).ready(function () {
    $(""#list-all-categories"").selectable({
        stop: function () {
            var result = $(""#selectedCategories"").empty();");

Response.Write( selectedCategories.Clear() );

Response.Write(@"$("".ui-selected"", this).each(function () {
                var Mytext = $(this).text();");

Response.Write( selectedCategories.Add(Mytext.ToString()));

Response.Write(@"});

        }
    });
});
</script>");

因此,您在Mytext上获得了编译异常,因为它不存在于服务器端 - 所有Javascript只是服务器端.Net代码的文本字符串。