【问题标题】:How can I insert markup for an ASP button into an ASP page that is in a text file?如何将 ASP 按钮的标记插入到文本文件中的 ASP 页中?
【发布时间】:2019-02-11 20:43:31
【问题描述】:

有没有办法从文本文件中读取 ASP 标记,并将其呈现到页面上?

我正在使用 Azure Maps 服务,并且我们在图钉上有弹出窗口。我想在弹出窗口中添加一个 ASP 按钮,以便用户可以“选择”一个位置,但我不知道该怎么做。

目前,我们将弹出内容的“模板”存储在一个文本文件中,该文件在创建地图时读取。我似乎无法在此文本文件中插入 ASP 控件,标记的呈现方式与文本文件中的完全相同,因此没有呈现按钮,但文本 <asp:Button ID="Button1" runat="server" Text="Button" /> 被添加到 HTML 输出中,它只是呈现为空。

任何关于如何添加 ASP 按钮的建议都会很棒。

更新:

模板存储在文本文件中的原因是因为它被读取并解析为一种方法,该方法用实际数据替换该文本文件中的某些 HTML 元素,该数据用于显示和隐藏模板中的某些项目,具体取决于什么地图引脚被选中。 Azure Maps 变量 popupTemplate 是一个字符串,其中包含要在弹出窗口中显示的 html 标记。我需要将该 HTML 字符串传递给 Azure Maps popupTemplate 以便显示。出于这个原因,我认为片面观点是行不通的。

我想要一个 ASP 按钮的原因实际上是为了易于使用。该地图位于 ASCX 控件内。单击该按钮时,需要更新控件上的属性值,关闭 Bootstrap 模式,然后执行由承载控件的父页面捕获的事件处理程序。然后,该父页面更新一个更新面板,该面板显示该控件中的属性值。我确信它可以只用 javascript 来完成,但我不知道如何完成这样的事情。我愿意接受这方面的教程,但我会说,当我在模板中添加一个标准的 HTML 按钮并包含一个 onclick 事件以显示警报时,地图无法加载。我从按钮中删除了 onclick 事件,它加载正常。我不知道为什么,但这是一个不同的问题。

更新 2:

@ADyson,现在所有的处理都是在服务器端完成的,客户端完成的唯一处理是当用户点击地图上的实际图钉时。发生这种情况时,Azure 提供的 JS 会导致出现一个弹出窗口,并将占位符替换为来自(现在是静态的)数据源的实际数据,该数据源是在地图显示之前在服务器端创建的。

当按钮被点击时,它不会刷新整个页面。它使用 Bootstrap 提供的数据属性(通过 javascript)关闭模式,然后调用导致异步回发的服务器端事件,该事件更新驻留在更新面板内的某些控件中的文本,然后在该更新上调用 Update() 方法面板,以便选定的地图点显示为被选中。整个页面都不会刷新。我知道这是因为除了我们的地图点之外,地图下方是搜索结果的文本列表。该文本列表还显示一个按钮。这些按钮是使用 Repeater 控件添加的 ASP 控件,它们执行我需要弹出模板中的按钮执行的操作。

有没有办法从另一个非 ASP 按钮控件调用 ASP 的单击事件?这样做可以,但是因为中继器列表中的按钮是动态添加的,所以我不知道如何引用它们,因为我无法将它们的 ID 设置为我可以引用的东西。这些按钮确实有一个独特的数据属性,尽管我可以引用它,但我不确定如何获得对它的引用。我可以使用 javascript 搜索数据属性值并返回对按钮的引用,然后将我的 HTML 的 onclick 事件设置为调用该按钮的 click() 事件吗?

我不想只更新 HTML 客户端的原因是,当用户单击“选择此位置”按钮时,ASCX 控件中的属性会更新。该属性用于以后的进一步处理。

我能够弄清楚为什么在添加 onclick 事件数据时地图停止工作。生成输出脚本时单引号转义失败的错误。

我可以分享代码,但我不确定您需要查看多少内容或哪些代码会有所帮助。

包含生成地图javascript的方法和属性的类(包括需要按钮的弹出模板)大约290行,并引用了4个其他类和2个接口。分享这一切可能很困难。一些代码还包含一些需要清除的专有和机密信息。

您似乎在告诉我,这实际上是不可能的,我需要找到一种不同的方法来做到这一点。

【问题讨论】:

  • 为什么需要使用<asp:语法添加按钮?您意识到 ASP.NET 在运行时所做的一切就是将其转换为 HTML <button 吗? (它可能会做一些其他聪明的事情来将它绑定到一些特定的回发参数,但这不是重点)。您的天蓝色地图是否保存在 aspx 页面中?在那种情况下,为什么要将模板存储在文本文件中?为什么不在 ASP.NET 局部视图中?然后将由 asp.net 引擎服务器端执行并转换为合适的 HTML 标记,并带有服务器端绑定。您还没有 100% 清楚地说明情况,但这是我的看法
  • @ADyson -- 我用一些额外的细节更新了我的问题。
  • "模板存储在文本文件中的原因是因为它被读取并解析为一种方法,该方法用用于显示和隐藏某些项目的实际数据替换该文本文件中的某些 HTML 元素" ...这或多或少是 ASP.NET 引擎所做的。因此,如果您使用部分(通过 Ajax 按需加载,可能在每个请求中传递给它的上下文参数),那么我认为您基本上只是将处理从客户端转移到服务器。
  • "按钮被点击时,需要更新控件上的属性值,关闭一个Bootstrap模式,然后执行一个事件处理程序,该事件处理程序被承载该控件的父页面捕获。那父页面然后更新更新面板“。这真的没有什么意义。如果您执行服务器端处理程序(在更新面板之外),那么它会从服务器刷新整个页面。因此,在这种情况下,更新控件、关闭道德和触发更新面板将是完全多余的,因为页面会从服务器重新加载。
  • 如果你有一个更新面板,它允许你进行部分更新(它在后台使用 Ajax)。所以你的按钮可能只是想在客户端做一些事情,这会触发更新面板,或者可能只是直接更新页面上的 HTML 而根本不去服务器。这取决于您是否需要同时将任何内容保存到数据库中。如果没有,那么我的建议是保留所有客户端。至于您在这方面需要做什么的具体细节,没有看到任何代码就不可能给出更详细的建议。

标签: javascript c# asp.net azure-maps


【解决方案1】:

弹出窗口通常是动态生成的。但是,您的 ASP.NET 代码似乎在服务器时间运行,这意味着它必须提前生成。使用内置弹出窗口不是您的方案的好选择。如果您必须使用 ASP.NET 控件而不是标准 HTML,我建议创建一个与地图分离的面板,然后根据需要使用绝对定位将其浮动在地图上方。这基本上是弹出窗口在幕后所做的,但这将允许您使用经典的 ASP.NET 功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 2017-03-30
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    相关资源
    最近更新 更多