Javascript Action循环导致页面上的模型错误(可变范围污染?)
我有一个视图(cshtml),上面有一个选项卡条。当然,每个选项卡的内容都不同。各个选项卡上有正确的数据/信息。当从单个选项卡上的控件进行选择时,会触发一些javascript。现在,第一个选项卡呈现javascript激发。所有其他选项卡都不会启动。在确实触发的选项卡(第一个)上,它获得了正确的值,但是当试图在模型中查找匹配项时,它没有找到匹配项。调试表明,模型中只有最后一个选项卡的数据可用。这就解释了为什么没有匹配,但回避了这样一个问题:第一页填充的数据在哪里 为了简洁起见,我删掉了代码。如果,在我无知的情况下,我遗漏了什么,就说出来,我会发布任何需要的东西 因此,首先是父cshtml:Javascript Action循环导致页面上的模型错误(可变范围污染?),javascript,jquery,asp.net-mvc,asp.net-mvc-3,razor-2,Javascript,Jquery,Asp.net Mvc,Asp.net Mvc 3,Razor 2,我有一个视图(cshtml),上面有一个选项卡条。当然,每个选项卡的内容都不同。各个选项卡上有正确的数据/信息。当从单个选项卡上的控件进行选择时,会触发一些javascript。现在,第一个选项卡呈现javascript激发。所有其他选项卡都不会启动。在确实触发的选项卡(第一个)上,它获得了正确的值,但是当试图在模型中查找匹配项时,它没有找到匹配项。调试表明,模型中只有最后一个选项卡的数据可用。这就解释了为什么没有匹配,但回避了这样一个问题:第一页填充的数据在哪里 为了简洁起见,我删掉了代码。如
foreach (var extbrd in Model.ExternalBoards)
{
tabstrip.Add()
.Text(extbrd.ExtForumName)
.ImageUrl("~/.../ForumTabIcon.png")
.Content(@<text>
<div>
@Html.Action("ActionName", "Controller", new { id = extbrd.BoardId });
</div>
</text>);
}
事实上就是这样。如上所述,我可以发布阅读器代码,但我不认为这是问题的根源
这个动作当然有一个观点,这就是我认为事情变得古怪的地方:
@model ExternalThreadsModel
<script type="text/javascript">
var model = @Html.Raw(Json.Encode(Model.RssThreads))
</script>
<script type="text/javascript">
$(function() {
$("#@Html.FieldIdFor(model => model.ExtForumIds)").click(function () {
var selectedItem = $(this).val();
var matchingObj = getObjects(model, 'ThreadValue', selectedItem);
if(matchingObj > 0)
{
var $iframe = $('#ForumFrame');
if ( $iframe.length ) {
$iframe.attr('src', matchingObj[0].Link);
}
var $prevfram = $('#ForumPreview');
if ( $prevfram.length ) {
$prevfram.val(matchingObj[0].Description);
}
}
});
});
function getObjects(obj, key, val) {
var objects = [];
for (var i in obj) {
if (!obj.hasOwnProperty(i)) continue;
if (typeof obj[i] == 'object') {
objects = objects.concat(getObjects(obj[i], key, val));
} else if (i == key && obj[key] == val) {
objects.push(obj);
}
}
return objects;
}
</script>
<div>
<table>
<tr>
<td>
@Html.DropDownListFor(model => model.ExtForumIds, Model.SelectThreads, new {style = "...", @size = 30})
</td>
<td style="width:25px;"> </td>
<td>
@{ Html.Telerik().TabStrip()
.Name("ForumView")
.Items(tabstrip =>
{
tabstrip.Add()
.Text("Preview")
.Content(@<text>
<div>
<textarea style="background-color:#979797; text-decoration: none;" id="ForumPreview" name="ForumPreview" rows="26" cols="200" readonly></textarea>
</div>
</text>);
tabstrip.Add()
.Text("Interactive")
.Content(@<text>
<div>
<iframe id="ForumFrame" name="ForumFrame" src="" style="width:800px;height:350px;"></iframe>
</div>
</text>);
})
.SelectedIndex(0)
.Render();
}
</td>
</tr>
</table>
</div>
@model ExternalThreadsModel
var model=@Html.Raw(Json.Encode(model.RssThreads))
$(函数(){
$(“#@Html.FieldIdFor(model=>model.ExtForumIds)”)。单击(函数(){
var selectedItem=$(this.val();
var matchingObj=getObjects(model,'ThreadValue',selectedItem);
如果(匹配bj>0)
{
变量$iframe=$(“#ForumFrame”);
如果($iframe.length){
$iframe.attr('src',matchingObj[0].Link);
}
var$prevfram=$(“#ForumPreview”);
如果($prevfram.length){
$prevfram.val(匹配对象[0]。说明);
}
}
});
});
函数getObjects(对象、键、值){
var对象=[];
用于(obj中的var i){
如果(!obj.hasOwnProperty(i))继续;
如果(对象的类型[i]=“对象”){
objects=objects.concat(getObjects(obj[i],key,val));
}else if(i==key&&obj[key]==val){
对象。推送(obj);
}
}
归还物品;
}
@Html.DropDownListFor(model=>model.ExtForumIds,model.SelectThreads,new{style=“…”,@size=30})
@{Html.Telerik().TabStrip())
.名称(“ForumView”)
.Items(tabstrip=>
{
tabstrip.Add()
.文本(“预览”)
.内容(@
);
tabstrip.Add()
.文本(“交互式”)
.内容(@
);
})
.已选择索引(0)
.Render();
}
因此,正如我提到的,每个选项卡上都有正确的数据/信息。当用户从下拉列表中选择一个项目时,就会出现问题
单击处理程序仅在第一个选项卡上激发。它不会为任何其他标签触发
在第一个选项卡上,单击处理程序确实会触发,并提取正确的selectedItem,但当它运行帮助函数getobjects时,没有找到匹配项
当我打断并检查“model”时,它被传递到getObjects中,它只包含最后一个选项卡的数据……所以,是的,没有任何东西会被匹配
对我来说,更奇怪的是这句话:
<script type="text/javascript">
var model = @Html.Raw(Json.Encode(Model.RssThreads))
</script>
var model=@Html.Raw(Json.Encode(model.RssThreads))
在HTML中,它确实呈现了一个json对象,其中包含来自所有选项卡的所有数据……因此……在某个地方,我一定遇到了可变范围污染
一如既往,非常感谢您的支持和帮助
<script type="text/javascript">
var model = @Html.Raw(Json.Encode(Model.RssThreads))
</script>