【问题标题】:Asp.Net data attributes dynamically updated through JS/jQuery but the updated attributes aren't updated when retrieved through code behindAsp.Net 数据属性通过 JS/jQuery 动态更新,但更新后的属性在通过后面的代码检索时不会更新
【发布时间】:2016-04-17 02:22:57
【问题描述】:

I have an aspx page of images that, when selected, a popup appears prompting for various information tid bits that I then store the information as data attributes on hidden labels through use of jQuery (i.e. data-id="####", data-difficulty="###", ETC。)。我承认这不一定是最好的方法,但我尝试了其他方法(见下文),但没有任何效果。

我一直在尝试检索动态更新的数据属性,但无济于事,以便可以将各种项目存储到我的本地 ms sql 数据库中。属性的更新非常有效,因为我可以在 Chrome 的开发人员工具中查看正在正确更新的项目。尽管如此,当我尝试提取相同的属性时,我可以看到它正在更新,但我无法在后面的代码中检索更新的值并继续取回初始值(通常是空字符串“”)。

这是aspx页面上的实现:

<asp:Label runat="server" ID="lblSelection" data-id="" data-count="" data-price="" data-difficulty=""  CssClass="selected-items" />

这是在同一页面上进一步单击“提交”按钮时调用的相关方法:

protected void SubmitClicked(object sender, EventArgs e)
{
    var currentID = lblSelection.Attributes["data-id"];
    var currentCount = lblSelection.Attributes["data-count"];
    var currentPrice = lblSelection.Attributes["data-price"];
    var currentDifficulty = lblSelection.Attributes["data-difficulty"];

    if (currentID == null || currentID == "")
    {
              // stop and throw an informative message to the user
    }else{
             // keep processing ...
    } 
}

问题在于,当我在调试模式下运行项目并检查这些元素(再次确保我可以直观地看到属性在开发人员工具中实际更新)时,它们都是“”的初始值.我唯一的猜测是存在某种回发问题,但我认为在我的方法被调用并完全处理之前不会发生这种情况。作为说明,我正在将图像填充到页面上,并已经通过基于项目 id 的 sql 调用更新它们的属性:

<img runat="server" src="" data-id="12345" />

初始加载一切正常,因此我可以清楚地从后面的代码中设置属性。无论出于何种原因,尽管在 jQuery 更新标签的属性之后(在一些点击等之后),我无法在后面的代码中获取更新的属性值。对此的任何提示或想法将不胜感激。

【问题讨论】:

  • 为什么不只使用&lt;asp:HiddenField&gt;?这样您就可以通过 js 在该字段中存储数据并在代码隐藏中检索。
  • 嗯,这就是我目前正在做的事情。无论如何,我在页面上将标签设置为display: none。我可以尝试一下,但考虑到它不适用于 HtmlImage 或 Label,我怀疑我是否还能从 HiddenField 中提取信息。

标签: c# jquery asp.net


【解决方案1】:

您尝试做的事情无法进行,因为:

  1. 自定义属性的值不会回传到服务器(如here 所述)。

  2. 即使您在客户端代码中设置标签的文本,它也不会在代码隐藏的Text 属性中可用。标签在页面中呈现为span 元素,并且该类型元素的内容不会回传到服务器。

在这个主题中给出了一个很好的包含在回发中的属性列表:Which values browser collects as a postback data?

按照 mshsayem 的建议,您应该使用 HiddenFields。如果出于某种原因,您想以不同的方式进行操作,您可以使用隐藏的文本框,在客户端代码中设置它们的 value,然后在代码隐藏中使用 Text 属性检索它。换句话说:HiddenFields 不是唯一可以在代码隐藏中检索客户端代码中设置的值的控件(但如果不显示控件,它们是显而易见的选择)。

【讨论】:

  • 我还没有机会尝试它(虽然我即将尝试),我会在几分钟后尝试隐藏控制。我一直在研究理解视图状态。作为一个想法,是否可以执行您在 JS 中看到的 preventDefault 之类的操作,以便在回调时保留这些值?
  • 我更新了我的答案。我对 ViewState 的引用不正确。其目的是保留在代码隐藏中设置的属性,而不是在客户端代码中。
  • 我最终使用了一个隐藏字段并使用我在 JS 中构建的 json 设置它的 value 属性,因为我需要传递多个参数。然后在后端反序列化,瞧,可读的参数化 json。
猜你喜欢
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多