2013-04-05 8 views
7

Obecnie używam tego podejścia, aby uzyskać poprawny względny URI (niezależnie od sytuacji wdrażania). Kod ostrzami (asp.net mvc 3):Url.Content dla javascript

@section JavaScript 
{ 
    <script type="text/javascript"> 
     var _getUrl = "@Url.Content("~/bla/di/bla")"; 
    </script> 
} 

Oddzielny plik js:

$.ajax({ 
    url: _getUrl, 

Myślisz, że tam jest lepszym rozwiązaniem?

+0

Twoje skrypty powinny znajdować się w osobnym pliku js, który można zminimalizować/zsynchronizować. – asawyer

+0

Robię to samo, ale nie jestem pewien, czy to dobrze. +1 na pytanie :) –

+2

@asawyer - nie jestem pewien, na czym polega Twój komentarz ... – cs0815

Odpowiedz

6

osobiście wolę HTML5 kabel, lub w tym * atrybutów adres URL jako część DOM element, który dyskretnie AJAXyfikuję.

Chodzi o to, że nigdy nie piszesz takich połączeń w ten sposób. Piszesz je, aby odpowiadały niektórym zdarzeniom z DOM. Jak na przykład kliknięcie kotwicy. W tym przypadku jest to banalne, wystarczy użyć pomocnika HTML do wygenerowania tego kotwicę:

@Html.ActionLink("click me", "someAction", "somecontroller", new { id = "123" }, new { @class = "link" }) 

a następnie:

$('.link').click(function() { 
    $.ajax({ 
     url: this.href, 
     type: 'GET', 
     success: function(result) { 
      ... 
     } 

    }); 
    return false; 
}); 

czy może są AJAXifying formularz:

@using (Html.BeginForm("SomeAction", "SomeController", FormMethod.Post, new { id = "myForm" })) 
{ 
    ... 
} 

i następnie:

$('#myForm').submit(function() { 
    $.ajax({ 
     url: this.action, 
     type: this.method, 
     data: $(this).serialize(), 
     success: function(result) { 
      ... 
     } 
    }); 
    return false; 
}); 

An innym przykładem byłoby użycie atrybutów danych HTML5 *, gdy odpowiedni URL nie jest dostępny w odpowiednim elemencie DOM. Załóżmy, że chcesz wywołać akcję kontrolera z AJAX, gdy zmieni się wybór rozwijanego menu. Pomyśl na przykład o kaskadowaniu ddls.

Oto w jaki sposób rozwijane może wyglądać tak:

@Html.DropDownListFor(x => x.SelectedValue, Model.Values, new { id = "myDdl", data_url = Url.Action("SomeAction") }) 

a następnie:

$('#myDdl').change(function() { 
    var url = $(this).data('url'); 
    var selectedValue = $(this).val(); 
    $.getJSON(url, { id: selectedValue }, function(result) { 
     ... 
    }); 
}); 

tak można zobaczyć naprawdę nie potrzebują tego _getUrl globalną zmienną JavaScript, który podajesz w widok.

+0

+1 Miałem zamiar wpisać przykład tego, ale masz to zwięzłości napisane. Dodatkowo powinienem zaznaczyć, że jestem pewien, że nauczyłem się od ciebie tej techniki. – asawyer

+0

@ darin-dimitrov to całkiem niezła odpowiedź. Chociaż może w pewnych okolicznościach dodać niepotrzebny html do strony (np. Jeśli "kliknięcie" nie ma sensu i musisz użyć ukrytego pola lub innego elementu DOM tylko do przechowywania wartości). – LiverpoolsNumber9

+3

Dlaczego byłby niepotrzebny? Dzięki temu twoja aplikacja będzie nadal działać nawet przy wyłączonym javascript. Nazywa się to stopniowym ulepszeniem. –

0

chciałbym wykonać następujące czynności:

Razor C# skrypt przed JavaScript

@{ 
    var myUrlString = Url.Action("ActionName", new { controller="ControllerName" }); 
} 

JavaScript

$.ajax('@myUrlString',{ 
    // options 
}); 

Można również użyć Url.RouteUrl lub Url.HttpRouteUrl.

Edycja - pokazano przykład z pliku o JS

żyletka plik

@{ 
    var myServerGeneratedValue = Url.Action("ActionName", new{controller="ControllerName"}); 
} 
<script type="text/javascript"> 
    var myHelperObject = new MyHelperObject(); 
    myHelperObject.Init('@myServerGeneratedValue'); 
</script> 

JS

var MyHelperObject = function(){ 

    this.Init = function(serverGeneratedValue){ 
     // do something with serverGeneratedValue 
    }; 

}; 
+0

Nazwa akcji może być łańcuchem, typ anon jest niepotrzebny. – asawyer

+0

Podoba mi się to, ponieważ zapewnia, że ​​wychodzące identyfikatory URI są synchronizowane, jeśli zmienia się routing. Wymaga to jednak umieszczenia kodu javascript w widoku! – cs0815

+0

@asawyer Nazwa akcji ** to ** ciąg znaków, a "typ anon" jest konieczny, jeśli prowadzisz do innego kontrolera/obszaru niż bieżący. W jaki sposób można dodać identyfikatory lub inne dane routingu bez tego? – LiverpoolsNumber9

Powiązane problemy