javascript - 如何在异步方法中返回 Json 对象以查看

标签 javascript json asp.net-mvc-2 asynchronous

我有 ASP.NET MVC 2 Web 应用程序。在页面加载时,我调用了一个 javascript 方法:

function getSomeData() {
  $.post(GetTablesDataUrl, null,
            function (data) {
               alert(data);
        });
}

然后在我的 HomeController.cs 中调用一个方法
public void GetTablesData()
{
  WebClient webClinet = new WebClient();
  webClinet.DownloadDataAsync( new Uri("http://somer_url"));
  webClinet.DownloadDataCompleted += new DownloadDataCompletedEventHandler(webClinet_DownloadDataCompleted);
}

下载完成后,执行下一个方法
void webClinet_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
{
  byte[] responseArray = e.Result;

  string s = responseArray.ToString();

  ReturnDataToPage(s);  // return json object
}

里面是 am 方法,可以像这样将数据返回到我的页面
[AcceptVerbs(HttpVerbs.Post)]
public JsonResult ReturnDataToPage(string s)
{
  var data = s;
  return Json(data);
}  

但我总是得到一个空字符串。我究竟做错了什么???

最佳答案

你有两种可能:

  • 使用普通 Controller ,因为 AJAX 调用已经是异步的,你可能不需要更多:
    public class TablesController : Controller
    {
        [HttpPost]
        public ActionResult ReturnTables(string s)
        {
            using (var client = new WebClient())
            {
                string result = client.DownloadString("http://example.com");
                // Assuming the remote address returns a JSON object
                // if not parse the response and return Json
                return Content(result, "application/json");
            }
        }
    }
    
  • 使用异步 Controller 和 IOCP(I/O 完成端口):
    public class TablesController : AsyncController
    {
        [HttpPost]
        public void ReturnTablesAsync(string s)
        {
            AsyncManager.OutstandingOperations.Increment();
            var client = new WebClient();
            client.DownloadStringCompleted += (sender, e) =>
            {
                try
                {
                    AsyncManager.Parameters["result"] = e.Result;
                }
                finally
                {
                    AsyncManager.OutstandingOperations.Decrement();
                }
            };
            client.DownloadStringAsync(new Uri("http://www.example.com"));
        }
    
        public ActionResult ReturnTablesCompleted(string result)
        {
            // Assuming the remote address returns a JSON object
            // if not parse the response and return Json
            return Content(result, "application/json");
        }
    }
    

  • 在这两种情况下,您都将以相同的方式使用这些操作:
    // Not sure exactly what was the purpose of the "s" query string
    // parameter as I am not using it in the action
    var data = { s: 'some data' };
    $.post('<%= Url.Action("ReturnTables", "Tables") %>', data, function(result) {
        // Do something with the result
    });
    

    这两种方法的区别在于异步版本将使用 I/O 完成端口,并且在检索远程资源期间不会阻塞任何工作线程。

    关于javascript - 如何在异步方法中返回 Json 对象以查看,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5141163/

    相关文章:

    javascript - Chrome 数字字段水平滚动

    javascript - JSON中位置0处的意外 token 与Node.js中的有效JSON一起发生

    ios - 如何解析此json并显示在uicollectionview中

    asp.net-mvc - 无法定义两个对象之间的关系,因为它们附加到不同的ObjectContext对象mvc 2

    .net - ASP.NET MVC 2 中是否可以嵌套区域?

    javascript - 将第一个元素放在新行上

    javascript - 使用 CDN 中的多个库会降低我的站点速度吗?

    javascript - ExtJS —将JSON数据加载到treepanel中

    asp.net-mvc - 将 Entity Framework 数据模型放在 MVC 应用程序中的何处?

    javascript - 在Javascript中将rgba值转换为一个整数