ViewData и javascript - имя класса не читается - PullRequest
1 голос
/ 26 октября 2011

По какой-то причине у меня возникают проблемы с присвоением 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печатается.Если я введу «.playerItem_hat» в атрибут «принять», он будет работать нормально.Но как только я использую @item внутри атрибута accept, кажется, что он не выбирает имя класса.Я вижу, что текст печатается в источнике, так что его определенно есть.Еще более странным является то, что, если я жестко закодирую 'item' в '.playerItem_hat', работает dropppable.Я сузил его до того момента, когда я использую ViewData ["itemType"].Я смотрел на некоторые другие темы, которые предлагают javascript.serialize, но, похоже, это отдельная проблема.

Есть ли что-то в жизненном цикле страницы, которую я пропускаю?Есть ли что-то, что может вызывать проблему при использовании ViewData внутри вызова jquery?Если бы текст вообще не печатался, я мог бы понять, но я вижу это там.Очень странно.

Кто-нибудь еще сталкивался с этой проблемой?

* Обновление *

Хорошо, так что, думаю, я понял проблему.Если кто-то еще сталкивается с этим, это кажется довольно простой ловушкой.

Код выше находится внутри страницы, которая вызывается через 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)

Это звучит правдоподобно?

...