如何将ObservableArray传递给MVC控制器?没有Ajax

时间:2014-08-05 13:03:45

标签: jquery ajax asp.net-mvc excel knockout.js

我有一个带有视图模型数据列表的可观察数组,我需要传递给Normal控制器,它的返回类型为ActionResult

      public ActionResult Index(list<qualities> data)
        {
          return excelCon.DownloadTMExcel(data); //here i get actionResult as ReturnType
        }

Java脚本代码:

var URL = "/DownloadExcel/Index?data="+self.qualities(); //self.qualities holds my entire list which hits break point in controller but i get Zero list . 
        window.open(URL, "_blank"); 

实际上,令人兴奋的情况是当一切正常时我会在新窗口打开的情况下下载excelsheet。

我需要有关如何传递observableArray的建议,就像我正在处理的那样。

我也厌倦了:

var URL = "/DownloadExcel/Index?data="+ko.toJson(self.qualities()); //this dont to controller itself 

我尝试使用Ajax调用仍然以一种方式工作,即我可以传递ObservableArray但ActionResult返回它无法处理的类型。总是它转到ajax调用的错误功能,我不会下载我的Excel。

唯一的案例对我有用:还有其他场景我只需要将参数传递给控制器​​然后我就可以打开一个新窗口并下载相关的Excel。

  var URL = "/DownloadExcel/Index?typeId="+2; 
        window.open(URL, "_blank"); //on open of new window i get excel downloaded

另外:

 [HttpPost]
        public ActionResult Index(list<qualities> data) // i get count ZERO
        {
            return View();
        }

使用字符串参数

[HttpPost]
            public ActionResult Index(string data) //break point at controller not even hitting 
            {
                return View();
            }

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您需要对值进行编码:

var URL = "/DownloadExcel/Index?data=" + 
    encodeURIComponent(ko.toJson(self.qualities()));

如果qualities包含的查询字符串数据太多,您可以使用帖子。例如:

<form method="post" action="/DownloadExcel/Index">
    <input type="hidden" name="data" data-bind="value: qualities" />
    <button>Download</button>
</form>

答案 1 :(得分:1)

GET请求的限制比规范中的POST小。

最初GET旨在小而简单,而POST的创建目标是有一天它可以用于文件上传等。您对POST所面临的限制不是来自规范,而是服务器配置,从技术上讲,它可以没有限制。

除了对GET的限制之外,浏览器还需要花费大量精力来减少长URL,以避免过去的缓冲区溢出漏洞,特制URL可以在客户端计算机上执行任意代码。

因此,您的解决方案更可能是POST请求。除了AJAX之外,这样做的一种方法是将数据保存到隐藏字段中:

<input type="hidden" id="json_to_send" name="json_to_send" />

document.getElementById('json_to_send').value = JSON.stringify(myobjectarray);

然后在服务器端的PHP中:

$myobjectarray = json_decode(html_entity_decode($_POST['json_to_send']));