【问题标题】:How to pass a ObservableArray to MVC controller ? Without Ajax如何将 ObservableArray 传递给 MVC 控制器?没有阿贾克斯
【发布时间】:2014-08-05 13:03:45
【问题描述】:

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

      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"); 

实际上,excat 场景是当一切正常时,我会在打开新窗口的情况下下载 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();
            }

非常感谢任何帮助。

【问题讨论】:

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


    【解决方案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>
    

    【讨论】:

    • 好的,让我检查一下。你确定我会在控制器中的list&lt;qualities&gt; data 得到一些东西吗?只是好奇,因为之前我尝试过像ko.toJson(self.qualities()) 这样的错误,说查询字符串限制超出了正确的范围。干杯
    • 问题是质量数据太多,或者对象中有循环引用。如果数据太多,您应该发布数据。也知道像这样将 JSON 发送到您的操作,它不会自动反序列化。您必须自己将 JSON 数据反序列化为对象。
    • 是的,我在 self.qualities 中有更多数据。尝试了你的方法,但我在控制器中什么也没得到。最后更新了我的观察结果,请查看它
    • HTTP 错误 404.15 - 未找到 请求过滤模块配置为拒绝查询字符串过长的请求。我面临的这个错误
    • 使用 window.open 会产生一个 GET 请求。您可以使用表格发布数据;查看我的更新。
    【解决方案2】:

    在规范中,GET 请求的限制小于 POST。

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

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

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

    &lt;input type="hidden" id="json_to_send" name="json_to_send" /&gt;

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

    然后在服务器端的 PHP 中:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多