ASP.NET MVC3 - динамически создавать JavaScript из Action - PullRequest
1 голос
/ 27 февраля 2012

У меня есть приложение MVC3, в котором у меня есть функции javascript, которые должны вызывать действия MVC, чтобы либо получить данные, либо перенаправить страницу.

В настоящее время javascript находится в файле cshtml (использует бритву), поэтому я могу воспользоваться функциями Url.Action(..) и Url.Content(..).

Если бы я хотел разделить эти файлы, то потерял бы компиляцию файлов на стороне сервера, поскольку .js явно не обрабатывается механизмом бритвы.

Можно ли создать представление в формате cshtml и вернуть содержимое (Reponse.ContentType) в виде 'application / javascript' или есть другой способ добиться желаемого результата?

Заранее спасибо

Sam

Ответы [ 2 ]

4 голосов
/ 27 февраля 2012

или есть ли другой способ добиться желаемого результата?

Есть на самом деле.Разработайте ваши функции JavaScript так, чтобы они принимали эти URL в качестве параметров.Тогда все, что вам нужно сделать, это оставить вызов инициализации в своем представлении и передать необходимые URL-адреса:

<script type="text/javascript">
    myJsInitialize('@Url.Action("Foo")', '@Url.Content("~/bar")');
</script>

, или другая возможность состоит в том, чтобы эти URL-адреса были частью DOM, с которым работает ваш javascript.Например, предположим, что у вас есть ссылка, и вы хотите отправить AJAX-запрос при нажатии на эту ссылку:

@Html.ActionLink("click me", "someaction", null, new { id = "mylink" })

, а в вашем отдельном js-файле вы будете использовать атрибут href ссылки, которая уже содержитURL:

$('#mylink').click(function() {
    $('#result').load(this.href);
    return false;
});

Но что если вам понадобится, например, другой URL в этой функции.Предположим, например, что вам нужно было вызвать действие, используя AJAX, когда изменяется выбор выпадающего списка.В этом случае вы можете использовать атрибуты HTML5 data-* в раскрывающемся списке:

@Html.DropDownListFor(
    x => x.SelectedItem,
    Model.Items,
    new { 
        id = "myddl",
        data_url = Url.Action("someaction")
    }
)

, а затем в отдельном файле javascript:

$('#myddl').change(function() {
    var selectedValue = $(this).val();
    var url = $(this).data('url');
    $.post(url, { value: selectedValue }, function(result) {
        // ...
    });
});

Посмотрите, как нам больше не нужно иметьФункции javascript зависят от помощников на стороне сервера, таких как Url.Action или Url.Content?Это позволяет вам помещать их в отдельные файлы javascript, не беспокоясь о том, что ваше приложение перестанет работать, например, при развертывании его в виртуальном каталоге IIS.

2 голосов
/ 27 февраля 2012

Немного известной особенностью блоков скриптов является то, что вы можете предоставить атрибут src И код в блоке.Итак, вы можете сделать что-то вроде этого:

<script type="text/javascript" src="@Url.Content("~/Scripts/Myscript.js")">
    var myurl = `@Url.Action("SomeAction", "SomeController")`;
</script>

Затем в вашем скрипте вы можете сослаться на myurl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...