Мне нужна помощь, чтобы вставить код в конец страницы ASP. NET с C# - PullRequest
0 голосов
/ 02 апреля 2020

Я пытался заставить следующее работать безуспешно

string MY_SCRIPT_CODE = "<script>";
MY_SCRIPT_CODE += " document.getElementById('rq1').addEventListener('click', function () {";
MY_SCRIPT_CODE += "     document.getElementById('myBtn').click();";
MY_SCRIPT_CODE += "  });";
MY_SCRIPT_CODE += "</script>"; 
System.Web.UI.HtmlControls.HtmlGenericControl bodyTag = new System.Web.UI.HtmlControls.HtmlGenericControl();
bodyTag = (System.Web.UI.HtmlControls.HtmlGenericControl)(Page.FindControl("</body>"));
bodyTag.Controls.Add(new LiteralControl(MY_SCRIPT_CODE));

<!-- Final Result should placed after the HTML Tag </body> --> 
<!-- and before the HTML Tag </html> after insertion -->
</body>
    <!-- Insertion from the C# Code  --->
    <script>
          document.getElementById("rq1").addEventListener('click', function () {
              document.getElementById("myBtn").click();
          });
    </script>
</html>

Возможно ли упомянутое выше?

TIA

1 Ответ

0 голосов
/ 02 апреля 2020

Это очень интересное требование.

Обычно мы добавляем скрипт на страницу, используя:

RegisterClientScriptBlock("myScript", MY_SCRIPT_CODE);

И позволяем Asp. Net указывать, куда поместить it.

И обычно мы не пытаемся поместить скрипт для присоединения к слушателю события "после закрывающего тега </body>", чтобы убедиться, что он выполняется после загрузки страницы, но делаем :( используя jquery, просто в качестве примера)

$(document).ready(function() {
    $("#rq1").on('click', function() { $("#myBtn").trigger('click'); });
}

Но хорошо, думая, что у вас есть это заданное c назначение (например, рендеринг точного вывода HTML как есть из более раннего проекта), Вот хак BAD BAD BAD, который должен сделать свое дело.

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

То, что мы делаем, мы сначала устанавливаем для theBody (наше фактическое тело) для вызова нашего метода делегата,

И когда мы на самом деле вызываем, мы взломать Control и стереть его и сделать <body> как вы sual, а затем визуализируем наш скрипт.

Вот реализация:

Сначала укажите ваш <body> и id и установите runat = "Server" для доступа к нему из кода:

ASPX:

<body runat="server" id="theBody">

Затем реализуйте это в своем коде:

ASPX.CS:

private void RenderMyScript(HtmlTextWriter output, Control container)
{
    object controlRareFields = typeof(Control)
        .GetProperty("RareFieldsEnsured", BindingFlags.NonPublic | BindingFlags.Instance)
        .GetValue(theBody, null);

    controlRareFields.GetType().GetField("RenderMethod").SetValue(controlRareFields, null);

    theBody.RenderControl(output);

    output.Write(MY_SCRIPT_CODE);
} 

И, наконец, переопределите OnPreRenderComplete и установите наш делегат:

protected override void OnPreRenderComplete(EventArgs e)
{
    base.OnPreRenderComplete(e);
    theBody.SetRenderMethodDelegate(RenderMyScript);
}

И это все.

Вот последние несколько строк, которые выводит моя страница:

<!-- End Browser Link -->

</body>

<script>
     document.getElementById('rq1').addEventListener('click', function () {;
         document.getElementById('myBtn').click();
     });
</script>

</body>

</html>

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...