我有一个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。有没有办法防止这种情况?
答案 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调用。