#javascript #asp.net-mvc-3 #razor
#javascript #asp.net-mvc-3 #razor
Вопрос:
Приведенный ниже код не работает.
Я перепробовал все формы
@:
@()
@{}
<text> </text>
Очевидная проблема заключается в {
и }
в начале и конце. (Требуется, как и параметры)
<script type="text/javascript">
function initializeFileUploader()
{
SetUploader('/Projects/ImageUpload', 'Images', true, ['jpg', 'jpeg', 'png', 'gif', 'zip'], { ProjectID: @Model.ID } );
SetUploader('/Projects/ImageUpload', 'Logo', false, ['jpg', 'jpeg', 'png', 'gif'], { Logo: true, ProjectID: "@(Model.ID)" } );
}
window.onload = initializeFileUploader;
</script>
Как использовать @Model.ID
в моем JavaScript?
[Править] Добавление информации
С помощью этого кода:
<script type="text/javascript">
function initializeFileUploader()
{
SetUploader('/Projects/ImageUpload', 'Images', true, ['jpg', 'jpeg', 'png', 'gif', 'zip'], { ProjectID: @HttpUtility.JavaScriptStringEncode(Model.ID.ToString(), true) });
SetUploader('/Projects/ImageUpload', 'Logo', false, ['jpg', 'jpeg', 'png', 'gif'], { Logo: true, ProjectID: @HttpUtility.JavaScriptStringEncode(Model.ID.ToString(), true) } );
}
window.onload = initializeFileUploader();
</script>
Razor генерирует этот код:
<script type="text/javascript">
function initializeFileUploader()
{
SetUploader('/Projects/ImageUpload', 'Images', true, ['jpg', 'jpeg', 'png', 'gif', 'zip'], { ProjectID: amp;quot;860c13af-9aa9-4667-8ee8-c5629515c71bamp;quot;
</body>
</html>
[Добавить] Другой пример кода
$('#Logo').bindAjaxUploader({
action: '/Project/ImageUpload',
allowedExtensions: ['jpg', 'jpeg', 'png', 'gif'],
params: { Logo: true, ProjectID: @HttpUtility.JavaScriptStringEncode(Model.ID.ToString(), true) }
});
Если вы задаете значение вручную, все работает идеально!
$('#Logo').bindAjaxUploader({
action: '/Project/ImageUpload',
allowedExtensions: ['jpg', 'jpeg', 'png', 'gif'],
params: { Logo: true, ProjectID: "559b0505-09f2-4385-aee0-530d79c82803" }
});
[Править / править код] Разрешение
Чтобы исправить проблему, мне пришлось сделать это: (не самый элегантный способ)
@{
@:function initializeFileUploader()
@:{
@:SetUploader('/Projects/ImageUpload', 'Images', true, ['jpg', 'jpeg', 'png', 'gif', 'zip'], { ProjectID: "@(HttpUtility.JavaScriptStringEncode(Model.ID.ToString()))" });
@:SetUploader('/Projects/ImageUpload', 'Logo', false, ['jpg', 'jpeg', 'png', 'gif'], { Logo: true, ProjectID: "@(HttpUtility.JavaScriptStringEncode(Model.ID.ToString()))" });
@:}
@:window.onload = initializeFileUploader;
}
Комментарии:
1. Определите «не работает». Что это должно делать? Что это делает? Какие сообщения об ошибках вы получаете (если таковые имеются)?
2. Это должно работать нормально. Что вы видите в отображаемом исходном коде? Является
Model.ID
ли это строкой?3.
Model.ID
и идентификатор объекта. При генерации HTML должен выглядеть примерно так:SetUploader('/Projects/ImageUpload', 'Images', true, ['jpg', 'jpeg', 'png', 'gif', 'zip'], { ProjectID: "123456"} );
Обратите внимание на значениеProjectID
, оно динамическое. Должен получитьModel.ID.
Для меня не работает! Сгенерированный HTML неверен, смотрите код Javascript, который генерирует этот код. Он не генерирует полный HTML-код, просто в ‘ProjectID: 123456’ И там!. Остальная часть JavaScript не генерируется.4. У вас проблема с sytnax в окружающем коде . Пожалуйста, покажите полный файл, демонстрирующий эту проблему.
5. Разместите все подробности (включая полный код) по этой ссылке: gist.github.com/1371965
Ответ №1:
window.onload = initializeFileUploader();
Это запускает initializeFileUploader() сразу, ПЕРЕД фактическим вызовом window.onload, это должно быть
window.onload = initializeFileUploader;
Комментарии:
1. Пожалуйста, посмотрите мои изменения в вопросе.
Ответ №2:
Попробуйте ввести @Model.ИДЕНТИФИКАТОР в одинарных кавычках ‘@Model.ID ‘. У меня это всегда работает.
Вот код:
function initializeFileUploader()
{
SetUploader('/Projects/ImageUpload', 'Images', true, ['jpg', 'jpeg', 'png', 'gif', 'zip'], { ProjectID: '@Model.ID' });
SetUploader('/Projects/ImageUpload', 'Logo', false, ['jpg', 'jpeg', 'png', 'gif'], { Logo: true, ProjectID: '@Model.ID' });
}
window.onload = initializeFileUploader;
Комментарии:
1. Я не знаю почему, но у меня это не работает! Это было то, что сгенерировал ‘razor’: i.imgur.com/CYx9W.png Это конец HTML-кода: <тип сценария=»текст/javascript»>
function initializeFileUploader() { SetUploader('/Projects/ImageUpload', 'Images', true, ['jpg', 'jpeg', 'png', 'gif', 'zip'], { ProjectID: 'ad9bc1d0-ab0b-45a9-8fe8-f7fb79146abb', true) </body> </html>
2. Я вижу, что идентификатор интерпретируется так, как должен. Вы пробовали жестко кодировать значение, чтобы посмотреть, будет ли оно успешно отображаться? Также было бы полезно, если бы вы могли предоставить нам всю разметку представления.
3.Здравствуйте, я изменил свою функцию. Я создал плагин jQuery для инкапсуляции всего. Было следующим:
$('#Logo').bindAjaxUploader({ action: '/Project/ImageUpload', allowedExtensions: ['jpg', 'jpeg', 'png', 'gif'], params: { Logo: true, ProjectID: "559b0505-09f2-4385-aee0-530d79c82803" } });
Как вы можете видеть, я ввел значение ID в параметрProjectID
4.
$('#Logo').bindAjaxUploader({ action: '/Project/ImageUpload', allowedExtensions: ['jpg', 'jpeg', 'png', 'gif'], params: { Logo: true, ProjectID: @HttpUtility.JavaScriptStringEncode(Model.ID.ToString(), true) } });
Та же функция, но с динамическим значением, не работает! Razor просто не генерирует HTML-код изProjectID:
5. Я заметил, что у меня была ошибка в моем коде выше. Попробуйте еще раз. Я отредактировал свой ответ.
Ответ №3:
Оба ваших примера кода должны работать нормально.
Мои экстрасенсорные способности подсказывают мне, что Model.ID
это строка, поэтому в конечном итоге вы записываете строковое значение в Javascript без кавычек. Поэтому он анализируется как имя переменной, а не как значение.
Вместо этого вызовите @HttpUtility.JavaScriptStringEncode(Model.ID, true)
для вывода правильно экранированного строкового литерала.
Комментарии:
1. ответ пользователя 551841 правильный; я пропустил это. Это может быть отдельной проблемой.
2. Пожалуйста, посмотрите мои изменения в вопросе.
3. Извините; я забыл добавить, что вам нужно
Html.Raw
не допускать, чтобы HTML-код экранировал Javascript. Возможно, вы захотите обернуть все это в свой собственный метод расширения.4. Похоже, у вас синтаксическая ошибка в вашем окружающем HTML, которая заставляет Razor думать, что это в контексте кода. Ищите несоответствующие теги и случайные
@
теги.5.Не могли бы вы опубликовать пример? Я попробовал следующим образом:
function initializeFileUploader() { SetUploader('/Projects/ImageUpload', 'Images', true, ['jpg', 'jpeg', 'png', 'gif', 'zip'], { ProjectID: @Html.Raw(HttpUtility.JavaScriptStringEncode(Model.ID.ToString(), true)) }); SetUploader('/Projects/ImageUpload', 'Logo', false, ['jpg', 'jpeg', 'png', 'gif'], { Logo: true, ProjectID: @Html.Raw(HttpUtility.JavaScriptStringEncode(Model.ID.ToString(), true)) } ); }