我有一个视图文件(.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” -...
我该怎么办?! 请帮帮我!
答案 0 :(得分:5)
你不能那样混合它们。
您需要仅使用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代码的文本字符串。