2011-03-03 57 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>