2011-03-03 88 views
0
$("#add_activity").click(function() { 
      $('#activities').append('@Html.Raw(Html.Partial("MyPartial").ToHtmlString())'); 
     }); 

我有這樣的一些代碼,這似乎是工作得很好,如果部分是這樣的:幫助與asp.net的MVC和jQuery

<tr><td>Foo</td><td><input type="text" name="bar" /></td></tr> 

,但無法工作,如果部分是這樣的

<tr> 
    <td> 
     Foo 
    </td> 
    <td> 
     <input type="text" name="bar" /> 
    </td> 
</tr> 

我該如何解決這個問題?..將所有內容放在一行是很糟糕的。

請幫忙。

+1

NachoF - 之前,我從來沒有見過這個問題 - 以往任何時候都:0)。你會不會發布所有相關的代碼,包括控制器代碼?它只是沒有加起來.. – 2011-03-03 15:22:31

回答

3

這很正常。如果您查看生成的頁面的源代碼,你會看到:

$('#activities').append(' 
<tr> 
    <td> 
     Foo 
    </td> 
    <td> 
     <input type="text" name="bar" /> 
    </td> 
</tr> 
'); 

這顯然是從很遠的東西,可以被認爲是有效的JavaScript。

你可以使用JavaScriptStringEncode方法是這樣的:

$("#add_activity").click(function() { 
    $('#activities').append('@HttpUtility.JavaScriptStringEncode(Html.Partial("MyPartial").ToHtmlString())'); 
}); 

將採取的正確編碼的HTML字符串護理,你將最終獲得有效的javascript:

$("#add_activity").click(function() { 
    $('#activities').append('\u003ctr\u003e\r\n  \u003ctd\u003e\r\n   Foo\r\n  \u003c/td\u003e\r\n  \u003ctd\u003e\r\n  \u003cinput type=\&quot;text\&quot; name=\&quot;bar\&quot; /\u003e\r\n  \u003c/td\u003e\r\n\u003c/tr\u003e'); 
}); 

產生所需結果。

+0

幾乎在那裏..但現在它增加了一個額外的「類型和名稱attrbiutes ..所以我得到 ignaciofuentes 2011-03-03 15:37:16

+0

@NachoF,確實有一個額外的雙引號,你可以使用AJAX嗎?它會更加優化,因爲除非他點擊按鈕,否則你不會將部分發送給客戶端。 – 2011-03-03 19:06:10

0

此作品在MVC3:

@{ 
    Layout = null; 
    var s = HttpUtility.JavaScriptStringEncode(Html.Partial("Banner").ToHtmlString().ToString()); 
} 
<iframe id="banner" src="about:blank" frameborder="0"></iframe> 
<script type="text/javascript"> 
    var doc = document.getElementById('banner').contentWindow.document; 
    doc.open(); 
    doc.write("@Html.Raw(s)"); 
    doc.close(); 
</script>