2013-04-05 12 views
7

Ich verwende derzeit diesen Ansatz, um den richtigen relativen URI (unabhängig von der Bereitstellungssituation) zu erhalten. Razor-Code (asp.net MVC 3):Url.Content für Javascript

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

Separate js-Datei:

$.ajax({ 
    url: _getUrl, 

Rechnen Sie damit, es gibt einen besseren Ansatz?

+0

Ihre Skripte sollten in einer separaten minimierbaren/cachbaren js-Datei vorliegen. – asawyer

+0

Ich mache das gleiche, aber ich bin mir nicht sicher, ob es gut ist. +1 für Frage :) –

+2

@asawyer - nicht sicher, was der Punkt Ihres Kommentars ist ... – cs0815

Antwort

6

persönlich bevorzuge ich mit HTML5 Daten- * Attribute oder darunter die URL als Teil eines DOM Element, das ich unaufdringlich AJAXify.

Die Sache ist, dass Sie nie schreiben $.ajax Anrufe herumfliegen so. Sie schreiben sie so, dass sie einigen DOM-Ereignissen entsprechen. Wie zum Beispiel das Klicken eines Ankers. In diesem Fall trivial es ist, verwenden Sie nur ein HTML-Helfer diesen Anker zu erzeugen:

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

und dann:

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

    }); 
    return false; 
}); 

oder vielleicht sind AJAXifying Sie ein Formular:

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

und dann:

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

An Ein anderes Beispiel wäre die Verwendung von HTML5-Daten * -Attributen, wenn für das entsprechende DOM-Element keine entsprechende URL verfügbar ist. Angenommen, Sie möchten eine Controller-Aktion mit AJAX aufrufen, wenn sich die Auswahl eines Dropdown-Menüs ändert. Denken Sie zum Beispiel an kaskadierende ddls.

Hier ist, wie Sie Ihre Drop-Down aussehen könnte:

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

und dann:

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

So wie Sie Sie sehen nicht wirklich brauchen diese _getUrl globale JavaScript-Variable, die Sie erklärt in Ihrem Aussicht.

+0

+1 Ich war dabei, ein Beispiel dafür zu tippen, aber Sie haben es prägnant geschrieben. Außerdem sollte ich darauf hinweisen, dass ich ziemlich sicher bin, dass ich die Technik von Ihnen gelernt habe. – asawyer

+0

@ Darin-Dimitrov das ist eine ziemlich gute Antwort. Dies kann unter Umständen zu unnötigem HTML-Code auf der Seite führen (z. B. wenn ein "Klick" nicht sinnvoll ist und Sie ein verstecktes Feld oder ein anderes DOM-Element verwenden müssen, um den Wert zu speichern). – LiverpoolsNumber9

+3

Warum wäre es unnötig? Dadurch kann Ihre Anwendung auch bei deaktiviertem JavaScript weiterhin funktionieren. Dies wird als progressive Verbesserung bezeichnet. –

0

Ich würde folgendes tun:

Razor C# Skript vor Javascript

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

JavaScript

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

Sie auch Url.RouteUrl oder Url.HttpRouteUrl nutzen könnten.

EDIT - zeigt Beispiel mit getrennten JS-Datei

Razor

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

JS-Datei

var MyHelperObject = function(){ 

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

}; 
+0

Der Aktionsname kann eine Zeichenfolge sein, der Anon-Typ ist nicht erforderlich. – asawyer

+0

Ich mag dies, da es sicherstellt, dass die ausgehenden URIs synchron gehalten werden, wenn sich das Routing ändert. Dies erfordert jedoch, dass der JavaScript-Code in der Ansicht angezeigt wird. – cs0815

+0

@asawyer Der Aktionsname ** ist ** eine Zeichenkette und der "Anon-Typ" ist notwendig, wenn Sie von einem aktuellen Controller zu einem anderen Controller/Bereich routen. Auch wie würden Sie IDs oder andere Routing-Daten ohne es hinzufügen? – LiverpoolsNumber9

Verwandte Themen