ASP.NET如何在回发期间发布更新(我知道回发是如何工作但仍然......)

时间:2015-12-13 03:50:03

标签: c# asp.net .net wcf asp.net-ajax

在我开始之前 - 我知道回发是如何工作的,我知道只有在完全呈现时页面才会更新,我只是想确保我的案例没有解决方案对页面进行细微更新。

问题定义。我有ASP.NET项目和WCF服务。 WCF服务包含很少的函数,这些函数返回一些字符串作为结果(例如,有错误或它是否顺利)。在ASP.NET网站上,我有一个按钮,可以触发一系列操作。这些操作是来自WCF服务的函数调用。通常回发(它被称为按下按钮的那些),页面将仅在接收到所有功能的结果时重新加载(这需要相当长的时间)。所有结果都会添加到文本框中。

问题即可。有没有办法真正异步地将结果添加到文本框中?我的意思是,真的,使用AJAX /其他东西,我不在乎。我无法相信这个问题在ASP.NET中尚未解决。我只需要一个用户来查看进度 - 在触发整个序列之前触发函数的结果。

我花了几个小时,除了UpdatePanel之外我没有找到任何线索,但是我无法用它来解决这个问题。你有什么想法吗?

protected void Button1_Click(object sender, EventArgs e)
{
  textBox1.text += wcf.function1();
  textBox1.text += wcf.function2();
  textBox1.text += wcf.function3();
  //only now the page updates.
}

1 个答案:

答案 0 :(得分:1)

使用ajax和泛型处理程序进行演示。此示例是在MonoDevelop中创建的,但您可以在不更改代码的情况下传递给Visual Studio。 文件夹和文件:



#include<stdio.h>
void pass(void* arg){
    char arr[1];
    memcpy(arr,(char *)arg,1);
    printf("%c",arr[0]);
}

void main(){
    char *buf=malloc(sizeof(char));
    buf[0]='X';
    pass(buf);
    free(buf);
}
&#13;
&#13;
&#13;

这是Default.aspx的代码

&#13;
&#13;
/*
DemoGenericHandler
     |
     |---Default.aspx
     |---Default.aspx.cs
     |
     |---GenericHandlers
     |         |
     |         |---MyHandler.ashx
     |         |---MyHandler.ashx.cs
     |
     |---web.config

*/
&#13;
&#13;
&#13;

这是代码隐藏:

<%@ Page Language="C#" Inherits="DemoGenericHandler.Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head runat="server">
	<title>Default</title>
	<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
	
	<script type="text/javascript">
	
	$(document).ready(function(){
		var $button1 = $("#<%= Button1.ClientID %>");
		var $txt1 = $("#<%= textBox1.ClientID %>");
		var $txt2 = $("#<%= textBox2.ClientID %>");
		var $txt3 = $("#<%= textBox3.ClientID %>");
		
		var $progressBar = $("#progressBar");
		
		$button1.click(function(e){
		
			//avoid postback
			e.preventDefault();
			
			//show progress bar
			$progressBar.fadeIn('fast');
			
			//ajax-post
			$.post("<%= ResolveClientUrl("~/") %>GenericHandlers/MyHandler.ashx", 
					{data:"requestFromDefaultPage"},
					function(jsonInstance){
						if(jsonInstance)
						{
							$txt1.val(jsonInstance.Value1);
							$txt2.val(jsonInstance.Value2);
							$txt3.val(jsonInstance.Value3);
						}
						
						//hide progressbar
						$progressBar.fadeOut('fast');
					
					});//ajax-post		
		});//click
		
	});
	</script>
</head>
<body>
	<form id="form1" runat="server">
		<asp:Button id="Button1" runat="server" Text="Call Ajax!" OnClick="Button1_Click" />	
		<img src="http://casa-vivebien.com/contents/media/progressbar.gif" id="progressBar" title="" style="display:none;" />
		<br />
		
		<asp:TextBox ID="textBox1" runat="server"></asp:TextBox>
		<asp:TextBox ID="textBox2" runat="server"></asp:TextBox>
		<asp:TextBox ID="textBox3" runat="server"></asp:TextBox>
		
	</form>
</body>
</html>

通用处理程序(* .ashx.cs)的代码:

using System;
using System.Web;
using System.Web.UI;

namespace DemoGenericHandler
{
    public partial class Default : System.Web.UI.Page
    {

        protected void Button1_Click(object sender, EventArgs e)
        {
          //textBox1.Text += wcf.function1();
          //textBox1.Text += wcf.function2();
          //textBox1.Text += wcf.function3();
          //only now the page updates.
        }
    }
}

捕获: enter image description here