SimpleModal打破ASP.Net回发

时间:2020-03-05 18:43:35  来源:igfitidea点击:

我在ASP.Net项目中使用jQuery和SimpleModal为Web应用程序创建了一些漂亮的对话框。不幸的是,模式对话框中的任何按钮都无法再执行其回发,这实际上是不能接受的。

我找到了一种解决方法,但是对于我一生,我无法使其正常工作,主要是因为我没有完全理解所有必要步骤。

我也有一种解决方法,它可以替换回发,但是它很丑陋,可能不是最可靠的。我真的很想使回发工作。有任何想法吗?

更新:我应该澄清,回发不起作用,因为用于执行回发的Java脚本在某种程度上已损坏,因此单击按钮时什么也没有发生。

解决方案

回答

所有标准ASP.NET回发都可以通过在页面上调用__doPostBack javascript方法来实现。该函数提交表单(ASP.NET实际上仅喜欢每页一个表单),该表单包括一些隐藏的输入字段,所有视图状态和其他优点都存在于其中。

从表面上看,我看不到SimpalModal中会破坏我们页面格式或者任何标准隐藏输入的任何内容,除非该模式的内容碰巧是从HTTP GET到ASP.NET页面。这将导致将两种ASP.NET表单呈现为一个DOM,并且几乎可以肯定会搞砸__doPostBack函数。

我们是否考虑过使用ASP.NET AJAX ModalPopup控件?

回答

Web浏览器将不会发布任何禁用或者隐藏的表单元素。

所以发生的是:

  • 用户单击对话框中的按钮。
  • 该按钮调用SimpleModal的close()方法,隐藏对话框和按钮
  • 客户端过帐表单(没有按钮的ID)
  • ASP.NET框架无法确定单击了哪个按钮
  • 服务器端代码未执行。

解决方案是在客户端上执行我们需要做的任何事情(在这种情况下,关闭对话框),然后自己调用__doPostback()。

例如(其中" dlg"是客户端的SimpleModal对话框参考):

btn.OnClientClick = string.Format("{0}; dlg.close();",
                        ClientScript.GetPostBackEventReference(btn, null));

那应该隐藏对话框,提交表单,并为该按钮调用任何服务器端事件。

@担

All standard ASP.NET postbacks work by calling a __doPostBack javascript method on the page.

asp:按钮不会调用__doPostback(),因为HTML输入控件已经提交了表单。

回答

你们俩都走在正确的轨道上。我意识到的是,SimpleModal将对话框添加到主体,该主体在ASP.Net的<form>之外,这破坏了功能,因为找不到元素。

为了解决这个问题,我刚刚修改了SimpleModal源,将所有添加内容添加到" form"而不是" body"上。创建对话框时,我还使用了" persist:true"选项,以确保按钮在打开和关闭过程中保持不变。

感谢大家的建议!

更新:1.3版在配置中添加了一个" appendTo"选项,用于指定应将模式对话框添加到哪个元素。这是文档。

回答

我发现以下作品没有修改simplemodal.js:

function modalShow(dialog) {

    // if the user clicks "Save" in dialog
    dialog.data.find('#ButtonSave').click(function(ev) {
        ev.preventDefault();

        //Perfom validation                

        // close the dialog
        $.modal.close();

        //Fire the click event of the hidden button to cause a postback
        dialog.data.find('#ButtonSaveTask').click();
    });

    dialog.data.find("#ButtonCancel").click(function(ev) {
        ev.preventDefault();
        $.modal.close();
    });
}

因此,不要使用对话框中的按钮引起回发,而是阻止其提交,然后在表单中找到一个隐藏的按钮并调用其click事件。

回答

FWIW,我已经更新了我们指向的博客文章,并进行了澄清,在此重新发布了推理和其他详细信息:

解决方法(截至我午餐前最后一次入住):

  • 将对话框div的innerHTML设置为单个
  • 劫持__doPostBack,将其指向新函数newDoPostBack

从我在网上看到的一些评论来看,第1点需要澄清。不幸的是,我不再拥有同一位雇主,也无法访问我使用的代码,但是我会尽我所能。首先,我们需要通过定义新函数并将对话框指向该对话框来覆盖对话框的onClose函数,如下所示:

$('#myJQselector').modal({onClose: mynewClose});
  • 调用对话框的默认"关闭"功能。在我们定义的函数中,我们应该首先调用默认功能(对于通常覆盖的所有内容的最佳做法):
  • 将对话框div的innerHTML设置为单个这不是必需的步骤,因此如果我们不了解此步骤,请跳过此步骤。
  • 劫持__doPostBack,将其指向新函数newDoPostBack
function myNewClose (dialog)
  {
      dialog.close();
      __doPostBack = newDoPostBack;
  }
  • 编写newDoPostBack函数:
function newDoPostBack(eventTarget, eventArgument)
{
      var theForm = document.forms[0];
      if (!theForm)
      {
          theForm = document.aspnetForm;
      }
  &#160;
      if (!theForm.onsubmit || (theForm.onsubmit() != false))
      {
          document.getElementById("__EVENTTARGET").value = eventTarget;
          document.getElementById("__EVENTARGUMENT").value = eventArgument;
          theForm.submit();
      }
}

回答

新的Jquery.simplemodal-1.3.js具有一个名为appendTo的选项。因此,请添加一个名为appendTo:'form'的选项,因为默认值为appendTo:'body',该选项在asp.net中不起作用。

回答

遇到了同样的问题,但是{appendTo:'form'}导致模式弹出窗口被完全错误地呈现(好像我有一个CSS问题)。

事实证明,我在其上构建的模板包括在页面上放置其他表单的模板。一旦设置了" {appendTo:'#aspnetForm'}"(默认的Asp.net表单ID),一切都将运行良好(包括回发)。

回答

非常感谢tghw和其他所有添加表单的贡献者,而不是身体固定,而对此感到困惑。 (由1.3版本上的属性解决)

顺便说一句:如果有人需要以编程方式从.net关闭对话框,则可以使用这种语法

private void CloseDialog()
{
    string script = string.Format(@"closeDialog()");
    ScriptManager.RegisterClientScriptBlock(this, typeof(Page), UniqueID, script, true);
}

这里的closedialog javascript是这样的...。

function closeDialog() {
        $.modal.close();
    }