簡體   English   中英

如何將 html 塊從代碼后面(C#)傳遞到 javascript function

[英]How to pass a html block from code behind(C#) to a javascript function

我目前正在寫我的期末論文。我有一個小問題。我需要將一個 HTML 塊傳遞給一個 javascript ZC1C425268E68385D1AB5074C17A94FI14Z 的字符串塊。因為它將起作用。這是代碼隱藏中的代碼:

string htmlFlightDetailsJavaScript ;

在字符串中,很少有具有 class 屬性的 div 和表。 像 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:

function fill(b) 
{
   alert(b);
}

請注意,我的 javascript function 在 ~.aspx 上。

我試圖傳遞沒有在 div 中的類和在字符串中的表的字符串並且它正在工作。但是當我嘗試通過類傳遞它時,它不起作用。有人可以幫助我嗎?

非常感謝

如果htmlFlightDetailsJavaScript中的類采用div class="bla"的形式,您可能必須轉義字符串中的引號或使用單引號,例如div class='bla'

使用 RegisterClientScriptBlock() 方法並確保在 HTML 中轉義引號。

"<div 類=\"廢話\">"

這聽起來像無效的 Javascript 正在生成

這個假設可以通過檢查實際傳輸的 Javascript 並在上下文中驗證整個結果的正確性來驗證。

也就是說,假設生成了這個無效的 Javascript:

alert("<div class="I just broke JS" ...>")

要解決此問題,請確保插入 Javascript 的字符串文字有效。

例如,上面的代碼可以寫成(使用下面的代碼):

RegisterClientScriptBlock(JsEncoder.Format(@"alert(""{0}"");", theInput))

...並且它不會中斷,因為該字符串之前已轉義。 (看看這個 output 並比較:插入的文字仍然有效 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");
                });
            }
        }
}

快樂編碼。

如果您使用 ajax 調用和部分控件(用戶控件)或自己編寫內容,我想您可以更快地完成。

1) 用戶控件將呈現您的 html 數據。 2) 后面的頁面代碼會接收到 ajax 調用並調用方法 thal 將呈現部分控制或寫入。 3) 該方法將寫入 Response.Output stream 並結束響應 (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();
}

PS:如果您願意,可以使用通用處理程序。 只需將 url 選項添加到 jQuery ajax 方法即可。

讓我知道它是否有幫助。

我會退后一步檢查整個 HTML 塊是否真的如此動態,以至於需要將其作為參數傳遞到 function 中。

更簡單的方法是將 HTML 元素作為頁面的一部分發出,然后從 function 中增加它。 IE。 顯示或隱藏它。

如果您的方案仍需要您將 HTML 作為參數傳遞,則需要HTML 在服務器端對整個字符串進行編碼,然后在 JS 中進行Unencode

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM