2012-10-12 10 views
8

ho notato che facendo @Url.Action("myAction", new { param1 = 123, param2 = 456}) mi fornisce un URL non valido Home/myAction?param1=123&param2=456.JQuery carico utilizzando MVC3 @ Url.Action non passa parametri correttamente

che sto cercando di fare

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

Ma solo param1 è sempre popolato nel metodo di azione.

Quando rimuovo lo & e lo faccio solo & allora funziona, ma fare una sostituzione di stringa è super hacky.

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

Mi manca qualcosa qui?

EDIT: Per richiesta sto tra cui alcuni del mio campione app. (È possibile creare un nuovo MVC app e basta aggiungere questi in modo rapido e vedere di persona)

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 Vista:

@ViewBag.Message 

Indice Vista:

<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

che è strano, sembra che tu non sei l'unico ... http://stackoverflow.com/questions/2898855/built -in-method-to-encode-ampersands-in-urls-return-from-url-action – xandercoded

+0

Puoi pubblicare come popolare il parametro 'url'? Immagino che manchi un 'Html.Raw()' da qualche parte ... – nemesv

risposta

14

Per impostazione predefinita ogni contenuto (che non è IHtmlString) emessi utilizzando un blocco @ viene automaticamente HTML codificata da Razor (si veda questa sezione Razor intro article Html Encoding)

I Url.Action restituisce solo una pianura string così ecco perché il & viene codificato.

Utilizzare il Html.Raw se non si desidera che l'encodeing:

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

entrambi questi lavori, ma non sono così puliti come vorrei –

+0

@NathanKoop se qualcosa è pulito o non pulito è molto soggettivo. Ecco come funziona Razor e la sua codifica ... di solito non si usa il metodo 'Url.Action' direttamente ma gli helper' Html.BeginForm' o 'Html.ActionLink' che si occupano della codifica. – nemesv

+0

dopo averci pensato un po 'di più, sembra la giusta decisione di progettazione. cambiando il valore di ritorno di 'Url.Action' in un' Type' richiederebbe ai consumatori di richiamare '.ToString()' su di esso quando usato da classi C# (come 'Url.Action' può essere usato in entrambi 'View 's e' Class'es) ... – xandercoded

4

Puoi anche creare l'url in questo modo.

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

entrambi questi lavori, ma non sono così puliti come vorrei –

Problemi correlati