[英]I need help inserting code to the end of the ASP.NET page with C#
我一直在努力使以下工作没有运气
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
这是一个非常有趣的要求。
通常,我们使用以下方法将脚本添加到页面:
RegisterClientScriptBlock("myScript", MY_SCRIPT_CODE);
并让 Asp.Net 处理放置它的位置。
通常,我们不会尝试将脚本附加到“在</body>
结束标记之后”的事件侦听器以确保它在页面加载后执行,而是这样做:(使用 jquery,仅作为示例) )
$(document).ready(function() {
$("#rq1").on('click', function() { $("#myBtn").trigger('click'); });
}
但是好吧,考虑到你有这个特定的任务(比如从早期的项目中呈现准确的 HTML 输出),这里有一个 BAD BAD BAD hack 应该可以解决问题。
重要的类Control
(所有 Web 控件都从该类扩展)使我们可以通过使用SetRenderMethodDelegate()
分配委托函数来完全覆盖控件的呈现。
我们所做的是,我们首先为theBody
(我们的实际主体)设置它来调用我们的委托方法,
当我们真正被调用时,我们侵入 Control 并擦除它并像往常一样渲染<body>
,然后渲染我们的脚本。
这是实现:
首先,给你的<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>
祝你好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.