2011-12-19 24 views
6

wiem, można użyć tej funkcji

@Url.Action("MyInfo", "Home") 

uniknąć hardcoding adresów URL, ale moi $.ajax rozmowy są w osobnym pliku .js. Czy powyższe nadal działa?

Z mojej wiedzy, @Url.Action będzie działać tylko w pliku Razor. Ale biorąc pod uwagę, że radzimy używać niezaskakującego JS, nie jestem do końca pewny, jak będę używał @Url.Action.

Prosimy o radę.

Odpowiedz

12

Czy powyższe nadal działa?

nr

Z mojej wiedzy, @ Url.Action będzie działać jedynie wewnątrz pliku Razor

Twoja wiedza jest poprawna.

Ale biorąc pod uwagę, że zaleca się stosowanie bez przeszkadzającego JS, nie jestem pewny jak bym użyć @ Url.Action.

Można używać HTML5 data- * atrybuty jakiegoś elementu DOM, które są dyskretnie wzmacniającej (chyba, że ​​ten element jest już <form> lub kotwicą w tym przypadku już to zawiera adres URL):

<div id="foo" data-url="@Url.Action("foo")">Hello</div> 

, a następnie w oddzielnym pliku javascript:

$(function() { 
    $('#foo').click(function() { 
     var url = $(this).data('url'); 
     // TODO: do something with the url 
    }); 
}); 
+0

Jeśli masz już "formularz", po prostu wykonaj następujące czynności: 'var url = $ ('form'). Url;'. –

4

Dodaj parametr funkcji dla ścieżek względnych. Na przykład w widoku:

<script type="text/javascript"> 
    var path = "@Url.Action("ActionName", "ControllerName")"; 

    someAjaxMethod(path) 
</script> 

oraz w zewnętrznym pliku JS:

function someAjaxMethod(path) 
{ 
    var data = {}; 
    $.ajax(path, data) 
} 
+0

Ten przykład nie pokazuje dobrego podejścia, ponieważ zmienna ścieżki jest teraz globalna. Lepiej byłoby używać przestrzeni nazw dla globalnych adresów URL lub "danych-url" dla lokalnych adresów URL. –

+0

Zgadzam się, że to nie jest najlepsza odpowiedź, a ja wolę podejście @ Darina, ale nadal jest ono poprawne dla prostych scenariuszy. – jrummell

+0

Przepraszam, ale cofnąłeś moją edycję realnymi ulepszeniami kodu, który nawet nie działa (błąd składni)? Zgłosiłbym dwa razy, gdybym mógł. Możesz napisać dowolny kod, ale nie możesz go skopiować! –