Asp.Net 将大量数据从视图发送到控制器

Posted

技术标签:

【中文标题】Asp.Net 将大量数据从视图发送到控制器【英文标题】:Asp.Net Sending large amounts of data from view to controller 【发布时间】:2014-09-12 07:04:43 【问题描述】:

我正在开发一个 Asp.net MVC 应用程序。在我的项目中,我使用了一个名为 Dhtmlx Scheduler 的第三方 javascript 库。

这个库中有一个函数,然后将调度器上的所有数据写入XML格式。 然后我需要处理这些数据,并在我的视图页面上写回<textarea>

到目前为止,这就是我所拥有的:

查看:

function save() 
    var url = "/Home/Save"

    var xml = scheduler.toXML();

    $.ajax(
        url: url,
        Type: "POST",
        dataType: 'json',
        async: false,
        data:  xmlString: xml ,
        contentType: 'application/json; charset=utf-8',
        success: alert("File Saved in C:\\ Drive as Tasks.xml")
    );

控制器:

public ActionResult Save(string xmlString)

    XmlDocument doc = new XmlDocument();
    try
    
        doc.LoadXml(xmlString);
    
    catch(Exception e)
    
        Console.WriteLine(e);
    
    doc.Save(@"C:\\Tasks.xml");

    W6ViewModel viewModel = new W6ViewModel();
    viewModel.engineers = db.W6ENGINEERS.ToList();
    viewModel.tasks = db.W6TASKS.ToList();
    viewModel.skills = db.W6TASKS_REQUIRED_SKILLS1.ToList();
    viewModel.categories = db.W6TASKTYPECATEGORY.ToList();

    gatherInfo(viewModel);

    return View("Index", viewModel);

当尝试保存三个事件(Dhtmlx 对象)时,它可以完美运行,当尝试向 XML 添加更多数据时,我收到此错误(从 FireBug 读取):

此请求的查询字符串长度超过了配置的 maxQueryStringLength 值。

任何帮助将不胜感激。 谢谢!

Firebug 控制台:

【问题讨论】:

你是在用 FireBug 模拟 POST 吗? 你看过here 在萤火虫中 - json 是在正文请求中发送的吗?如果是,您应该尝试直接从请求Stream 获取正文内容,而不是通过活页夹。 @pwas 和我本质上要问的是:数据是如何发送到您的控制器的?您的错误表明它是作为查询字符串而不是 HTTP POST 正文内容发送的。 这就是问题所在 - 您正在制作 GET 而不是 POST。首先,将$.ajax中的Type改为type。其次,将HttpPost 属性添加到您的操作中。如果没有这个,操作将仅适用于 GET 请求。 【参考方案1】:

我相信 jQuery.ajax 使用 type 而不是 Type。这是区分大小写的。如果您查看您的 Firebug,它正在执行 GET 请求而不是 POST:

$.ajax(
    url: url,
    Type: "POST",
    dataType: 'json',
    async: false,
    data:  xmlString: xml ,
    contentType: 'application/json; charset=utf-8',
    success: alert("File Saved in C:\\ Drive as Tasks.xml")
);

应该是

$.ajax(
    url: url,
    type: "POST",
    dataType: 'json',
    async: false,
    data:  xmlString: xml ,
    contentType: 'application/json; charset=utf-8',
    success: alert("File Saved in C:\\ Drive as Tasks.xml")
);

【讨论】:

非常重要:控制器的动作应该用HttpPost 属性修饰 - 否则只会对GET 请求可见。 @pwas 如果你不装饰控制器,它可以是 POST 或 GET(可能是事件 DELETE、PUT 等)。但是,如果他用HttpPost 装饰它,他会得到一个 404 并且问题可能更容易识别。 @Dismissile:我认为默认值是HttpGET @malkam 我刚刚编写了一个快速演示程序来证明这一点,如果您不在 MVC 中的操作方法上使用任何属性,那么它将接受 GET 或 POST。 @malkam 实际上并没有这样的默认值,但是添加属性会将其限制为仅使用该方法。【参考方案2】:

Grr 我还不能评论,我似乎记得你是否传递了一个原始值

data: xml 

而不是

data :  xmlString: xml 

【讨论】:

很遗憾,这并没有解决我的问题,我之前也遇到过这样的问题,因此 xml 将映射到 Action 变量。 现在控制器用 [HttpPost] 修饰使用 public ActionResult Save([FromBody] string xmlString) 使用 [FromBody] 但使用 data: "" : xml 它在某处!前段时间遇到这个问题时绞尽脑汁 感谢您的帮助!但我尝试了 "" : xml 的原始和您的建议仍然没有结果。 data = "'xmlString':'" + xml + "' " 如果没有帮助,那么该喝茶了,我去拿帽子和外套。【参考方案3】:

在这篇文章中有解释-> request exceeds the configured maxQueryStringLength when using [Authorize]

您应该更改 web.config 中的配置设置,以允许超过默认值的 2048 字符。

所以基本上你需要改变 <httpRuntime maxRequestLength = "" maxQueryStringLength =""> 到您认为可以接受的数字。

编辑:您是否尝试将您的 Type: "POST" 更改为 type: "POST" ? 因为 javascript 是区分大小写的语言。

至于无效的 Json 原语试试这个:

    $.ajax(
            url: url,
            type: "POST",
            dataType: 'json',
            async: false,
            data: 'xmlString='+ xml,
            contentType: 'application/json; charset=utf-8',
            success: alert("File Saved in C:\\ Drive as Tasks.xml")
        );

【讨论】:

这可能是一个非常糟糕的主意。代码应该将数据放在 POST 正文中,而不是放在查询字符串中。 这确实解决了问题,但我担心这不是向服务器发送大量信息的最佳方式。还有其他发送数据的方式吗? 是的,虽然我发布的方法应该让您运行,但在其他地方的代码中主要存在问题,该代码获取发布数据并将其转换为查询字符串。 是的,确切地说,到目前为止,我不知道有更好的方法来处理这种情况。 我们可以查看您的路线配置吗?请

以上是关于Asp.Net 将大量数据从视图发送到控制器的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 从视图发送到控制器 ASP.NET MVC 会给出空值

asp.net中大量数据并发

ASP.Net MVC 将数据从视图传递到不同文件夹中的控制器

从控制器事件(无客户端请求)向视图发送数据 ASP.NET MVC 4

传递需要的大量 Json 对象时如何改进 Asp.net Mvc 应用程序?

在asp.net中向客户端导出大量数据