2012-10-12 91 views
8

我注意到做@Url.Action("myAction", new { param1 = 123, param2 = 456})爲我提供了一個無效的URL Home/myAction?param1=123&param2=456使用MVC3 @ Url.Action的JQuery加載不能正確傳遞參數

我試圖做

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

但只有param1在操作方法得到填充。

當我刪除&並使它只是&然後它的工作,但做一個字符串替換是超級哈克。

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

我在這裏錯過了什麼嗎?

編輯:根據要求我包括我的一些示例應用程序。 (您可以創建一個新的MVC應用程序,只需添加這很快看到自己)

控制器:

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查看:

@ViewBag.Message 

索引視圖:

<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

這是奇怪的,看起來你是不是唯一的一個... http://stackoverflow.com/questions/2898855/built -in-method-to-encode-andpersands-in-urls-returned-from-url-action – xandercoded

+0

你可以發表你如何填充你的'url'參數嗎?我猜你錯過了一個'Html.Raw()'的地方... – nemesv

回答

14

缺省情況下使用@塊自動HTML由剃刀編碼發射的每個內容(這是不IHtmlString)(見本Razor intro article HTML編碼部)

Url.Action返回只是一個普通string所以這就是爲什麼&被編碼。

使用Html.Raw,如果你不希望encodeing:

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

這些工作乾淨的感覺,但他們沒有那麼幹淨的感覺因爲我想 –

+0

@NathanKoop無論乾淨還是不乾淨都是非常主觀的。這就是Razor及其編碼的工作原理......通常您不直接使用Url.Action方法,而是使用'Html.BeginForm'或'Html.ActionLink'輔助函數來處理編碼。 – nemesv

+0

經過一番思考後,似乎是正確的設計決策。如果將Url.Action的返回值更改爲Type,則需要消費者在從C#類使用時調用'.ToString()'(因爲'Url.Action'可以同時用於'View '和'Class'es)... – xandercoded

4

你也可以用這種方式建立網址。

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

這兩個工作,但他們並沒有像我想 –