服务器端ASP.net代码从jQueryUI模式对话框中导致完整的回发

时间:2011-03-17 16:43:56

标签: jquery asp.net jquery-ui

我有一个ASP.Net页面名称ListView.aspx,它显示了一个记录列表。它使用jQueryUI显示单个记录模式对话框的详细信息。模态对话框的内容是另一个名为DetailsView.aspx的asp.net页面。它显示如下:

function DisplayDetails(promoID) {

            $("#promotionDetailsDialog").dialog({
                height: 400,
                width: 600,
                modal: true
            }).load("DetailsPage.aspx?ID=" + promoID);

            return false;
        }

对话框中显示的DetailsView页面很简单。

<body>
    <form id="form1" runat="server">
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
    <br />
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
    </form>
</body>

DetailsView Button1_Click事件处理程序中的服务器端代码进行简单的数据库调用。我的问题是,在回传模式对话框上的按钮后,浏览器会从ListView重定向到DetailsView。有没有办法防止这种情况?

1 个答案:

答案 0 :(得分:0)

事实是,回发是页面的简单帖子。所以我们在这里发布了DetailsPage.aspx,所以你自然会得到该页面的响应。

TheSuperTrump是对的 - 最好的解决方案是通过ajax执行数据库调用。您可以为此创建一个sipmle Web服务,稍后可以将其用于类似问题,并将WebMethod属性应用于某些Service方法,以通过ajax从js调用它。

[WebMethod(EnableSession = true)]
public string GetPromotionMessage(int employeeId)
{
    return String.Format("Congratulation! You're promoted {0}", Employee.GetEmployeeByID(employeeId).FullName);
}

然后在你的客户端js中调用它

ServiceNamespace.ServiceName.GetPromotionMessage(parseInt(employeeId), function (result) { ... }, function (exception) { alert(exception.get_message()); });

这个属性允许你在你的方法中使用会话变量(可能你需要这个来访问数据库 - 没有属性在尝试访问会话时会引发运行时异常)

此功能

function (exception) { alert(exception.get_message()); }
如果即使没有try-catch块,也会在你的服务方法中使用一个exeption来调用

在您收到服务方法响应后,将调用函数function(result){...}。如果您的服务方法返回一些更复杂的数据,结果将包含与您的服务方法返回类型具有类似结构的json数据。 (它将包含可在服务器上以相同名称访问的公共属性。但是,如果数据太过Comlpex,则会出现一些复杂情况。)

使用[WebMethod]属性标记Page方法也有类似的方法。

还有一种更简单的方法可以通过玩asp:UpdatePanel并设置Button1 Click事件来修复它,因为它的异步回发触发器就像那样

<asp:UpdatePanel ID="UpdatePanel1" runat="server">

  <ContentTemplate>
  ...
  </ContentTemplate>

  <Triggers>
    <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />
  </Triggers>

</asp:UpdatePanel>

它应该暂停完整的回发并重新加载部分中的部分。 !!!注意:更新面板需要在页面或母版页上使用ScriptManager Control,否则您将获得运行时异常。

如果您提供更多代码,我还可以显示ajax服务webMethod调用的示例,但我想您可以轻松地进行谷歌搜索。

但imho看起来很简单,但更新面板通常不是最佳解决方案。我更喜欢使用服务/页面webMethod调用。