или есть ли другой способ добиться желаемого результата?
Есть на самом деле.Разработайте ваши функции 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.