MVC эквивалент @Html.ActionLink через javascript

Как закодировать эквивалент @Html.ActionLink через javascript-код, то есть вызвать действие MVC, которое затем создаст новый View, не возвращаясь к вызывающему виду?

Ответ 1

javascript - это язык на стороне клиента, который ничего не знает о используемом вами языке на стороне сервера. Таким образом, это нормально, что в javascript помощника на стороне сервера нет эквивалента, который генерирует URL-адрес, используя определения маршрутов на стороне сервера.

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

<script type="text/javascript">
    var url = '@Url.Action("SomeAction", "SomeController")';
    // do something with the url client side variable, for example redirect
    window.location.href = url;
</script>

Если вы хотите использовать этот URL-адрес в отдельном файле javascript, где у вас нет доступа к помощникам на стороне сервера, вы все равно можете в зависимости от ситуации включить этот URL-адрес в некоторый элемент DOM.

Например:

<div id="foo" data-url="@Url.Action("SomeAction", "SomeController")">Click me</div>

Обратите внимание на атрибут data-url HTML5, который мы встроили в DOM, и использовал вспомогательный сервер на стороне сервера, чтобы гарантировать, что сгенерированный URL всегда будет правильным на основе наших определений маршрутизации. Теперь мы можем в отдельном файле javascript незаметно подписаться на событие click этого div и получить URL-адрес:

$('#foo').click(function() {
    var url = $(this).data('url');
    // do something with the url client side variable, for example redirect
    window.location.href = url;
});

Другие примеры, очевидно, включают стандартные элементы <a> и <form>, которые должны быть сгенерированы с использованием HTML-помощников на стороне сервера, а затем все, что вам нужно сделать в отдельном файле javascript, - это получить их соответствующие href или action атрибуты для получения фактического URL-адреса и сделать что-то с ним.

Ответ 2

Другой вариант - сохранить URL-адрес в скрытом <div> где-то на вашей странице и вызвать его через Javascript позже. Это будет выглядеть так:

Index.cshtml

<div style="display: none;" id="url">
   @Url.Action("SomeAction", "SomeController")
</div>

Затем вы можете использовать его в своем файле Script.js для создания любых ссылок, которые вы хотите.

var url = $("#url").text();

Затем переменная URL будет содержать ссылку websafe на /SomeController/SomeAction.