出于某种原因,我无法将viewdata分配给某些javascript。
我有以下代码:
@{
string item = ".playerItem_" + ViewData["itemType"];
}
<script type="text/javascript">
$(function () {
console.log(item);
$(".items.droppable").droppable({
accept: '@item',
drop: function (event, ui) {
//...
}
});
});
</script>
如果我看一下控制台,我可以看到'.playerItem_hat'正在打印。如果我在'accept'属性中键入'.playerItem_hat',它可以正常工作。但是一旦我在accept属性中使用@item,它似乎就没有拿起类名。我可以看到文本在源中打印,所以它肯定存在。更奇怪的是,如果我将'item'硬编码为'.playerItem_hat',则droppable会起作用。每当我使用ViewData [“itemType”]时,我都会缩小范围。我看了一些其他建议javascript.serialize的帖子,但这似乎是一个单独的问题。
我是否遗漏了页面生命周期?通过在jquery调用中使用ViewData,是否有任何可能导致问题的原因?如果文字根本不打印,我可以理解,但我可以在那里看到它。很奇怪。
其他人遇到过这个问题吗?
好的,我想我已经找到了问题所在。如果有其他人遇到这个问题,那么这似乎是一个相当容易的陷阱。
上面的代码位于通过Html.Partial调用的页面内。上面的ViewData是我正在传递给页面的字符串,有5个不同的调用。
Html.Partial("PageModules/Shared/ItemModule", Model, new ViewDataDictionary() {{"moduleType", "head"}})}
Html.Partial("PageModules/Shared/ItemModule", Model, new ViewDataDictionary() {{"moduleType", "feet"}})}
Html.Partial("PageModules/Shared/ItemModule", Model, new ViewDataDictionary() {{"moduleType", "hands"}})
等等。问题似乎是上面的代码生成了,但实际上没有输出到什么叫做输出流?换句话说,第一个调用生成html,然后第二个调用生成html,更改moduleType 的值。此时,html实际上还没有插入到包含这些部分调用的页面中。至少,据我所知,它是沿着这些方向发展的。
诀窍是强制它输出html,然后移动到下一个部分调用,并根据需要修改ViewData的值。我的解决方案是添加:
@{ string itemBarHtml = Html.Partial("PageModules/Shared/GraphicalModuleBar", Model, new ViewDataDictionary() {{"moduleType", "head"}}).ToString();
}
@Html.Raw(itemBarHtml)
听起来有道理吗?