如何将html块从代码隐藏(C#)传递给javascript函数

时间:2011-04-27 17:34:11

标签: c# javascript asp.net dom dynamic

我目前正在研究我的最终论文。我有一个小问题。我需要将一个字符串块的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中的类和字符串中的表,它正在工作。但是当我尝试将它传递给类时,它不起作用。任何人都可以帮助我吗?

非常感谢

6 个答案:

答案 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