2012-10-12 120 views
8

Me di cuenta de que al hacer @Url.Action("myAction", new { param1 = 123, param2 = 456}) me proporciona una URL no válida Home/myAction?param1=123&param2=456.JQuery Load usando MVC3 @ Url.Action no pasa parámetros correctamente

que estoy tratando de hacer

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

Pero sólo param1 está consiguiendo poblada del método de acción.

Cuando elimino el & y lo hago solo & entonces funciona, pero al reemplazar una cadena es super hacky.

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

¿Echo a perder algo aquí?

EDIT: Por solicitud, incluyo algunas de las aplicaciones de muestra. (Se puede crear una nueva aplicación MVC y sólo tiene que añadir estos rápida y ver por sí mismo)

controlador:

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 

Índice 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

que es raro, parece que no es el único ... http://stackoverflow.com/questions/2898855/built -in-method-to-encode-ampersands-in-urls-returned-from-url-action – xandercoded

+0

¿Puedes publicar cómo rellenas tu parámetro 'url'? Supongo que te falta un 'Html.Raw()' en algún lugar ... – nemesv

Respuesta

14

Por defecto todos los contenidos (que no es IHtmlString) emitida utilizando un bloque @ está automáticamente HTML codificado por Razor (ver esta sección Razor intro article codificación html)

Los Url.Action vuelve simplemente una llanura string así que por eso el & se codifica.

Uso del Html.Raw si no desea que el encodeing:

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

, ambos funcionan, pero no son tan limpios. como me gustaría –

+0

@NathanKoop si algo está limpio o no está limpio es muy subjetivo. Así es como funciona Razor y su codificación ... normalmente no usas el método 'Url.Action' directamente, sino los helpers' Html.BeginForm' o 'Html.ActionLink' que se ocupan de la codificación. – nemesv

+0

después de pensarlo un poco más, parece la decisión de diseño correcta. cambiar el valor de retorno de 'Url.Action' a 'Type' requeriría que los consumidores llamaran' .ToString() 'sobre él cuando se utiliza desde clases C# (ya que' Url.Action' se puede usar en ambos 'Ver 's y' Class'es) ... – xandercoded

4

Puedes construir la URL de esta manera también.

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

ambos funcionan, pero no están tan limpios como me gustaría –