web-dev-qa-db-fra.com

Asp.Net Mvc Url.Action dans un fichier js externe?

Dans un fichier js externe, je ne peux pas utiliser 

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

Quand j'écris comme ceci:

url = "/Controller/Action"

Et si le projet se trouve dans un sous-dossier, les scripts ne fonctionnent pas. J'ai besoin de quelque chose comme ceci comme URL relative:

url = "~/Controller/Action"

Comment puis-je faire ceci? Merci.

48

Comme les fichiers .js ne sont pas analysés par le moteur de visualisation asp.net mvc, vous ne pouvez utiliser aucun code c #. Je suggère d'utiliser l'approche discrète, quelque chose comme ça

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

Et en javascript, utilisez la valeur de data-request-url

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

Je ne sais pas si c'est la solution la plus élégante, mais j'ai différencié les registres de la mise en œuvre réelle dans les scripts externes, de sorte que:

<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...);
}

Donc, dans mes vues, je n'avais que les fonctions de registre et les scripts contenaient les valeurs spéciales en tant que paramètre pour faire ce que je voulais.

J'espère que ça aide,

6
Jorge Alvarado

Voici un motif que j'ai utilisé. C'est un peu plus d'étapes, mais j'aime bien que toutes mes URL se trouvent dans un emplacement organisé dans la vue. 

Au bas de ma vue, je vais inclure une section Scripts qui contient les URL comme ceci:

@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>
}

À l'intérieur de ma classe JavaScript (qui se trouve dans un fichier externe), je vais référencer l'URL comme suit:

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

Je réalise que les entrées n'ont pas besoin d'être référencées à l'intérieur de la classe, mais j'aime bien les avoir là-bas pour mon propre entretien ménager.

2
Airn5475

Comme décrit dans la réponse acceptée, vous ne pouvez utiliser aucun code C # dans un fichier JS externe. Voici ce que je fais normalement si je dois transmettre quelques liens de contrôleur à mon fichier .js externe.

En 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>

Dans myfile.js

var _url1;
var _url2;

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

   // other init. codes...

}
0
Muhammad Saqib