Asp.Net Mvc Url.Action во внешнем файле js?

Во внешнем файле js я не могу использовать

url = "@Url.Action("Action", "Controller")" 
//url output : @Url.Action("Action", "Controller")
//I get IllegalPath Name error.

Когда я пишу так:

url = "/Controller/Action"

И если проект находится в подпапке, то сценарии не работают. Мне нужно что-то вроде этого как относительный URL:

url = "~/Controller/Action"

Как я могу это сделать? Благодарю.

6 ответов

Решение

Так как файлы.js не анализируются механизмом просмотра asp.net mvc, вы просто не можете использовать там какой-либо код C#. Я бы предложил использовать ненавязчивый подход, что-то вроде этого

<div id="loader" data-request-url="@Url.Action("Action", "Controller")"></div>

И в JavaScript, используйте значение data-request-url

$(function(){
   $('#loader').click(function(){
       var url = $(this).data('request-url');
       alert(url);
   });
});

Я не уверен, что это самое элегантное решение, но я сделал различие между регистрами и реальной реализацией во внешних скриптах, так что:

<script>...</script>
... include all the external scripts I need

$(document).ready(function(){

    //get all the information you need from your MVC context 
    //before going out of context and into the scripts
    var url = '@Url.Action("Action", "Controller")'; 


     RegisterMyFunction(url, other parameters ..);
     RegisterAnotherFunction(url, others...);
}

Так что, на мой взгляд, у меня были только функции регистра, а скрипты содержали специальные значения в качестве параметра, чтобы делать все, что я хотел.

Надеюсь, поможет,

Вот образец, который я использовал. Это немного больше шагов, но мне нравится, что все мои URL-адреса находятся в одном организованном месте в представлении.

Внизу моего представления я включу раздел сценариев, в котором содержатся URL-адреса, например:

@section Scripts
{
    <script type="text/javascript">
        myJavaScriptObject.firstUrl = '@Url.Action("Action1", "Controller", new {id = Model.Id})';
        myJavaScriptObject.secondUrl = '@Url.Action("Action2", "Controller", new {id = Model.Id})';
    </script>
}

Внутри моего класса JavaScript (который находится во внешнем файле) я буду ссылаться на URL следующим образом:

var myJavaScriptObject = {
    firstUrl: '',
    secondUrl: '',
    docReady: function() {
        $.get(myJavaScriptObject.firstUrl, function(data) { do something...  });
    }
}

Я понимаю, что на записи не нужно ссылаться внутри класса, но мне нравится иметь их там для моей домашней работы.

Вы можете использовать скрытые поля, чтобы сделать то же самое (в основных / индивидуальных представлениях).

Просмотр страницы:

@Html.Hidden("commonUrlTrack", Url.Action("Action_Method_Name", "Controller_Name"))

<button onclick="commonFunction()">Click Me</button>

JS-файл:

function commonFunction() {
    var url = $("#commonUrlTrack").val();        
    alert(url);        
}

Как описано в принятом ответе, вы не можете использовать любой код C# во внешнем файле JS. Вот что я обычно делаю, если мне нужно передать несколько ссылок контроллера на мой внешний файл.js.

В C# (.cshtml)

<script src="~/js/myfile.js"></script>

<script type="text/javascript">

    var url1 =  "@Url.Action("ActionName", "ControllerName", new { Param = ViewBag.Param })";  
    var url2 = "@Url.Action("AnotherAction", "AnotherController")";

    $(function() {
        window.initScript(url1, url2);
    });

</script>

В myfile.js

var _url1;
var _url2;

function initScript(url1, url2) {
    _url1 = url1;
    _url2 = url2;

   // other init. codes...

}

Я поместил этот код в свой _Layout.cshtml в голове.

      <script type="text/javascript">
    var yourCompanyUrlPrefix = '@Url.Action("", "")';
  </script>

а затем используйте yourCompanyUrlPrefix в любом js-файле

Другие вопросы по тегам