我目前正在研究我的最终论文。我有一个小问题。我需要将一个字符串块的HTML块传递给javascript函数。我必须从后面的代码中执行此操作。我已经尝试了这么多我似乎并没有这样做。这是代码隐藏中的代码:
string htmlFlightDetailsJavaScript ;
在字符串中,有几个div和table都有类的属性。类似于div class =“bla”
ClientScriptManager cs = Page.ClientScript;
StringBuilder csText = new StringBuilder();
csText.Append("fill("+htmlFlightDetailsJavaScript+");");
cs.RegisterStartupScript(this.GetType(), "alert", csText.ToString(), true);
这是我的javascript函数:
function fill(b)
{
alert(b);
}
请注意,我的javascript函数位于〜.aspx。
我试图传递字符串,不包含div中的类和字符串中的表,它正在工作。但是当我尝试将它传递给类时,它不起作用。任何人都可以帮助我吗?
非常感谢
答案 0 :(得分:1)
答案 1 :(得分:1)
如果htmlFlightDetailsJavaScript
中的类格式为div class="bla"
,则您可能必须转义字符串中的引号或使用单引号,例如div class='bla'
。
答案 2 :(得分:1)
使用RegisterClientScriptBlock()方法并确保在HTML中转义引号。
“< div class = \”blah \“>”
答案 3 :(得分:1)
这听起来像生成无效的Javascript 。
可以通过检查传输的实际 Javascript并在上下文中验证整个结果的正确性来验证此假设。
也就是说,假设生成了这个无效的Javascript:
alert("<div class="I just broke JS" ...>")
要解决此问题,请确保插入到Javascript中的字符串文字有效。
例如,上面的内容可能会被写成(使用以下代码):
RegisterClientScriptBlock(JsEncoder.Format(@"alert(""{0}"");", theInput))
...并且它不会中断,因为字符串之前已被转义。 (看看这个输出并进行比较:插入的文字仍然是有效的Javascript,即使是theInput
中的引号或其他字符。作为额外的奖励,</script>
也可以打破代码; - )
此代码“免费使用,修改,出售,无论如何”。 YMMV。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace sbcjc.sei
{
public class JsEncoder
{
static Regex EncodeLiteralRegex;
// Format a bunch of literals.
public static string Format (string format, params object[] items)
{
return string.Format(format,
items.Select(item => EncodeString("" + item)).ToArray());
}
// Given a string, return a string suitable for safe
// use within a Javascript literal inside a <script> block.
// This approach errs on the side of "ugly" escaping.
public static string EncodeString (string value)
{
if (EncodeLiteralRegex == null) {
// initial accept "space to ~" in ASCII then reject quotes
// and some XML chars (this avoids `</script>`, `<![CDATA[..]]>>`, and XML vs HTML issues)
// "/" is not allowed because it requires an escape in JSON
var accepted = Enumerable.Range(32, 127 - 32)
.Except(new int[] { '"', '\'', '\\', '&', '<', '>', '/' });
// pattern matches everything but accepted
EncodeLiteralRegex = new Regex("[^" +
string.Join("", accepted.Select(c => @"\x" + c.ToString("x2")).ToArray())
+ "]");
}
return EncodeLiteralRegex.Replace(value ?? "", (match) =>
{
var ch = (int)match.Value[0]; // only matches a character at a time
return ch <= 127
? @"\x" + ch.ToString("x2") // not JSON
: @"\u" + ch.ToString("x4");
});
}
}
}
快乐的编码。
答案 4 :(得分:0)
如果您使用ajax调用和部分控件(用户控件)或自己编写内容,我想您可以更快地完成任务。
1)用户控件将呈现您的html数据。 2)后面的页面代码将接收ajax调用并调用方法thal将呈现部分控制或写入。 3)该方法将写入Response.Output流并结束响应(Response.End()) 4)javascript将处理响应并显示结果。
(使用jQuery)
// main.js
jQuery.ajax({
type: 'POST',
data: { isajax: true, ajaxcall: 'MyMethod' },
dataType: 'html',
success: function (data, textStatus, jqXHR) {
alert(data);
}
});
// CodeBehind
protected void Page_Load(object sender, EventArgs e)
{
if (Request.HttpMethod == "POST" && Request["isajax"] == "true")
{
this.AjaxCall(Request);
}
}
private void AjaxCall(HttpRequest request)
{
switch (request["ajaxcall"])
{
case "MyMethod": this.MyMethod(request); break;
default: break;
}
}
private void MyMethod(HttpRequest request)
{
Response.ContentType = "text/html";
Response.Write("YOUR CONTENT GOES HERE.");
// Or, render a User Control
Response.End();
}
P.S。:如果您愿意,可以使用Generic Handler。只需将url选项添加到jQuery ajax方法。
如果有帮助,请告诉我。
答案 5 :(得分:0)
我退后一步,检查整个HTML块是否真的如此动态,以至于它需要作为参数传递给函数。
更简单的方法是将HTML元素作为页面的一部分发出,然后从函数中扩充它。即。显示或隐藏它。
如果您的方案仍然要求您将HTML作为参数传递,则需要HTML encode服务器端的整个字符串,然后是JS中的Unencode。