2012-10-12 5 views
8

Ich habe festgestellt, dass @Url.Action("myAction", new { param1 = 123, param2 = 456}) mich mit einer ungültigen URL Home/myAction?param1=123&param2=456 verursacht.JQuery Load mit MVC3 @ Url.Action übergibt keine Parameter richtig

Ich versuche

$("#myAjaxDiv").load(url); 

Aber nur param1 wird immer in der Aktionsmethode zu tun bevölkert.

Wenn ich die & entfernen und es nur & machen, dann funktioniert es, aber eine Zeichenfolge zu ersetzen, ist super hacky.

url = url.replace("&", "&"); 

Fehle ich hier etwas?

EDIT: Pro Anfrage schließe ich einige meiner Beispiel-App. (Sie können einen neuen MVC-app erstellen und nur diese schnell hinzufügen und sehen Sie selbst)

Controller:

public ActionResult AjaxTest(int? year, int? month) 
{ 
    ViewBag.Message = string.Format("Year: {0}, Month: {1}", year.HasValue ? year.ToString() : "no year", month.HasValue ? month.ToString() : "no month"); 
    return PartialView("AjaxTest"); 
} 

AjaxTest Ausblick:

@ViewBag.Message 

Übersicht:

<script> 
    $(function() { 
     var url=""; 
     $("#noParams").click(function() { 
      url = "Home/AjaxTest"; 
      $("#ajaxy").load(url) 
      $("#url").text(url); 
     }); 
     $("#yearParam").click(function() { 
      url = "Home/AjaxTest?year=2012"; 
      $("#ajaxy").load(url) 
      $("#url").text(url); 
     }); 
     $("#yearAndMonthParam").click(function() { 
      url = "Home/AjaxTest?year=2012&month=10"; 
      $("#ajaxy").load(url) 
      $("#url").text(url); 
     }); 

     $("#generated").click(function() { 
      url = "@(Url.Action("AjaxTest", new { year=2012, month=10}))"; 
      $("#ajaxy").load(url); 
      $("#url").text(url); 
     }); 

    }); 
</script> 

<a id="noParams" href="#">No Params</a> <br /> 
<a id="yearParam" href="#">Year Param</a> <br /> 
<a id="yearAndMonthParam" href="#">Year and Month Param</a> <br /> 
<a id="generated" href="#">Generated</a> <br /> 
<div id="ajaxy"> 

</div> 

<div> 
URL: <span id="url"></span> 
</div> 
+1

, die seltsam, sieht aus wie du nicht der einzige bist ... http://stackoverflow.com/questions/2898855/built -in-method-to-encode-Ampersands-in-urls-returned-from-url-action – xandercoded

+0

Können Sie posten, wie füllen Sie Ihren 'url' Parameter? Ich denke, Sie vermissen ein 'Html.Raw()' irgendwo ... – nemesv

Antwort

14

standardmäßig alle Inhalte (die nicht IHtmlString ist) emittiert mit einem @ Block automatisch HTML kodiert von Razor (siehe diese Razor intro article HTML-Codierung Abschnitt)

Die Url.Action kehrt nur eine einfache string so ist, warum Die & wird codiert.

Verwenden Sie die Html.Raw, wenn Sie nicht die encodeing wollen:

url = "@(Html.Raw(Url.Action("AjaxTest", new { year=2012, month=10})))"; 
+0

beide funktionieren, aber sie sind nicht so sauberes Gefühl wie ich möchte –

+0

@NathanKoop ob etwas sauber oder nicht sauber ist sehr subjektiv. So funktioniert Razor und seine Kodierung ... normalerweise benutzt man nicht die 'Url.Action' Methode direkt, sondern die' Html.BeginForm' oder 'Html.ActionLink' Helfer, die sich um die Kodierung kümmern. – nemesv

+0

nachdem wir darüber nachgedacht haben, scheint es die richtige Designentscheidung zu sein. Wenn Sie den Rückgabewert von "Url.Action" in einen "Type" ändern, müssen die Benutzer davon '.ToString()' aufrufen, wenn sie aus C# -Klassen verwendet werden (da 'Url.Action' in beiden Ansichten verwendet werden kann) 's und' Class's) ... – xandercoded

4

Sie können die URL auch auf diese Weise erstellen.

var url = "@Url.Action("AjaxTest","YourControllerName")?year=2012&month=10"; 
$("#ajaxy").load(url); 
+0

beide funktionieren, aber sie sind nicht so sauber Gefühl, wie ich möchte –

Verwandte Themen