【问题标题】:jQuery update of asp:HiddenField fails to be persisted across postbackasp:HiddenField 的 jQuery 更新无法在回发中持久化
【发布时间】:2011-04-13 15:40:22
【问题描述】:

我在 sitecore(它是一个 ascx 控件)中有一个子布局,其中包含一个隐藏字段和一个图像映射。根据被点击的图像映射区域,我想设置隐藏字段的值,然后发起回发到服务器。

我的标记如下:

<script type="text/javascript">
function SetRegion(regionName) {
    $('#<%=hdnRegion.ClientID%>').val(regionName);
    __doPostBack('<%=lnkRedirectButton.UniqueID%>', '');
}
</script>

<img src="/Images/Interface/Map-Background.png" usemap="#regionMapView" class="map" />
<map id="regionMapView" name="regionMapView">
    <area id="x" href="javascript:SetRegion('x')" shape="poly" coords=",,,," />
    <area id="y" href="javascript:SetRegion('y')" shape="poly" coords=",,,," />
    <area id="z" href="javascript:SetRegion('z')" shape="poly" coords=",,,," />
</map>

<asp:HiddenField ID="hdnRegion" runat="server" />
<asp:LinkButton ID="lnkRedirectButton" onclick="lnkRedirectButton_Click" runat="server" />

我的代码隐藏如下:

    protected void lnkRedirectButton_Click(object sender, EventArgs e)
    {
        string region = hdnRegion.Value; //at this point, I expect hdnRegion.Value to be "x" "y" or "z" but it's always coming back empty :-(
        //do stuff...
    }

我添加了虚拟 LinkBut​​ton 以用作回发的挂钩(以创建代码隐藏方法来处理回发)。

我已经在一个独立的 web 应用程序中尝试过这段代码,它似乎工作正常,所以我想知道在回发过程中,sitecore 是否有什么事情弄乱了隐藏字段的值?

澄清;回发事件正在服务器上被触发和处理,我已经在 javascript 中使用 alert() 来确认隐藏字段值设置正确。

编辑: 重新标记问题以包含 jquery-ui 标记。 这个问题似乎与所有这些都发生在一个 div 内的事实有关,该 div 使用 jQuery UI 库中的 $().dialog() 方法显示...

【问题讨论】:

  • 您的子布局上是否有子布局缓存?这会影响输出到页面的 HTML。
  • 嗨,我不知道。不过这提醒了我,在这种情况下,控件直接放在我的布局 aspx 上,不用作子布局。
  • 因此,如果您将呈现的 ID 硬编码到 __doPostBack() 函数中,它是否有效?
  • 我会试一试,但我的问题与正确启动回发无关;在回发过程中,隐藏字段的值在某处丢失。
  • 我会采取循序渐进的方法。首先,正如您所做的那样,将 ID 硬编码到 JS 回发调用中,并使用 VS 调试器查看是否甚至调用了 lnkRedirectButton_Click()。如果不是,那么它似乎将 ID 传递到回发中,它不会导致 LinkBut​​ton 单击。如果调试器确实捕获了代码并且您发现它确实运行了您的 click 方法,那么下一步是否要尝试如何访问 HiddenField 的值。将其分解为小步骤,看看在哪一步它实际上没有按预期工作。

标签: javascript jquery asp.net jquery-ui sitecore


【解决方案1】:

正如我在编辑中提到的,此问题与隐藏字段(以及其他所有内容)位于使用 jQuery UI 对话框方法操作以创建弹出窗口的 div 内的事实有关。

我发现了这个问题 (HiddenField value modified by javascript is not posted back) 这给了我答案,并涉及在对话框方法构造函数中向 open: callback 添加一行代码。

我打开对话框的 JavaScript 代码修改如下:

$('#MyDialog').dialog({
    closeOnEscape: true,
    open: function(event, ui) {
        $(this).parent().appendTo("form"); //this line sorted everything!
    }
}); 

引用DanaBenson“我相信根本原因是jQueryUI将对话框附加到BODY标签而不是FORM标签,.Net需要它。”

【讨论】:

  • 啊,谢谢 - 我一直在试图弄清楚为什么我的 jQuery UI 对话框没有回发复选框字段。
  • 万一它对某人不起作用,这可能很有用:$("#divName").parent().appendTo(jQuery("form:first"));
【解决方案2】:

为什么不将值作为回发参数而不是隐藏字段值传回,因为您只是在执行即时回发?

【讨论】:

  • 啊好主意。我会创建一个不可见的文本框,还是有更好的方法?
  • 我相信这只是 __doPostBack() 方法中的第二个参数。您应该能够传递 regionName 而不是空字符串。然后使用 Request["__EVENTARGUMENT"] 访问它。没试过这个,所以我可能会离开。
  • 酷,有道理。我会在星期一试一试!
【解决方案3】:

尝试使用 ClientID 而不是 UniqueID

__doPostBack('', '');

【讨论】:

  • 试过这个吗?如果我使用 ClientID 而不是 UniqueID,页面将回发,但不会调用我的 lnkRedirectButton_Click 事件处理程序方法。
  • 我对 ClientID 使用相同的方法。我不知道为什么它对你不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 2011-02-15
相关资源
最近更新 更多