Как передать html-блок из кода (C #) в функцию JavaScript - PullRequest
3 голосов
/ 27 апреля 2011

В настоящее время я работаю над своим последним тезисом. У меня небольшая проблема. Мне нужно передать блок HTML, который является строковым блоком, в функцию javascript. Я должен сделать это из кода позади. Я очень много пробовалЯ не вижу, как это будет работать. Вот код в коде позади:

string htmlFlightDetailsJavaScript ;

В строке есть несколько 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 fill(b) 
{
   alert(b);
}

Обратите внимание, что моя функция JavaScript находится в ~ .aspx.

Я попытался передать строку без классов, которые находятся в div, а таблица - в строке, и она работает. Но когда я пытаюсь передать ее с классами, она не работает. Кто-нибудь может мне помочь?

Большое спасибо

Ответы [ 6 ]

1 голос
/ 27 апреля 2011

Похоже, генерируется недопустимый 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");
                });
            }
        }
}

Удачного кодирования.

1 голос
/ 27 апреля 2011

Используйте метод RegisterClientScriptBlock () и убедитесь, что в вашем HTML нет кавычек.

"

"
1 голос
/ 27 апреля 2011

Если классы в htmlFlightDetailsJavaScript имеют форму div class="bla", вам, вероятно, придется избегать кавычек в строке или использовать одинарные кавычки, например, div class='bla'.

1 голос
/ 27 апреля 2011

Вы можете использовать метод ClientScriptManager.RegisterStartupScript .

0 голосов
/ 27 апреля 2011

Я бы сделал шаг назад и проверил, действительно ли весь HTML-блок настолько динамичен, что его нужно передать в функцию в качестве параметра.

Проще всего было бы, чтобы элемент HTML выдавался как часть страницы, а затем увеличивать его из вашей функции.то есть.показать или скрыть его.

Если ваш сценарий все еще требует, чтобы вы передавали HTML в качестве параметра, вам нужно HTML кодировать всю строку на стороне сервера, а затем Unencode в JS.

0 голосов
/ 27 апреля 2011

Полагаю, вы сможете добиться гораздо быстрее, если будете использовать вызов ajax и частичный элемент управления (пользовательский элемент управления) или сами напишите контент.

1) Элемент управления будет отображать ваши HTML-данные.2) Код страницы получит вызов ajax и вызовет метод, который будет выполнять частичный контроль или запись.3) Метод будет писать в потоке Response.Output и завершать Response (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.

Дайте мне знать, если это поможет.

...