Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从MVC控制器操作中检索XML作为可下载附件_Javascript_C#_Asp.net_Asp.net Mvc_Webforms - Fatal编程技术网

Javascript 从MVC控制器操作中检索XML作为可下载附件

Javascript 从MVC控制器操作中检索XML作为可下载附件,javascript,c#,asp.net,asp.net-mvc,webforms,Javascript,C#,Asp.net,Asp.net Mvc,Webforms,我正在重写一个现有的webform,以使用js库,而不是使用供应商控件和microsoftajax工具(基本上是更新web应用程序以使用更现代的方法) “原样”页面(webform)使用服务器上的按钮单击处理程序处理提交的数据并返回包含xml的文档,然后可以保存或打开该文档(打开会将其作为浏览器中的另一个选项卡打开)。这是异步发生的 未来页面使用jQueryAjax将表单提交给MVC控制器,在MVC控制器中执行的代码与服务器端回发的代码几乎相同。我已经在浏览器中验证了调用者返回的是相同的数据,但

我正在重写一个现有的webform,以使用js库,而不是使用供应商控件和microsoftajax工具(基本上是更新web应用程序以使用更现代的方法)

“原样”页面(webform)使用服务器上的按钮单击处理程序处理提交的数据并返回包含xml的文档,然后可以保存或打开该文档(打开会将其作为浏览器中的另一个选项卡打开)。这是异步发生的

未来页面使用jQueryAjax将表单提交给MVC控制器,在MVC控制器中执行的代码与服务器端回发的代码几乎相同。我已经在浏览器中验证了调用者返回的是相同的数据,但是,在返回数据后,不会提示用户保存/打开-页面只是保持好像什么都没发生过一样

我将把代码放在下面,但我想我只是缺少了回发和ajax/controller上下文之间的一些关键区别,以提示浏览器将返回的数据识别为要保存的单独附件。我的问题是,我已经研究并尝试了很多特别的方法,我不确定在这一点上我做错了什么

原样服务器端处理程序 (节略,因为SendXml()方法是生成响应的方法)

TO-BE(使用jquery提交给控制器操作) 客户端代码:按钮单击处理程序:

queueModel.getXmlForSelectedOrders = function () {
    //create form to submit
    $('body').append('<form id="formXmlTest"></form>');

    //submit handler
    $('#formXmlTest').submit(function(event) {
        var orderNbrs = queueModel.selectedItems().map(function (e) { return e.OrderId() });
        console.log(orderNbrs);
        var ordersForXml = orderNbrs;
        var urlx = "http://localhost:1234/svc/OrderServices/GetXml";
        $.ajax({
            url: urlx,
            type: 'POST',
            data: { orders: ordersForXml },
            dataType: "xml",
            accepts: {
                xml: 'application/xhtml+xml',
                text: 'text/plain'
            }
        }).done(function (data) {
              /*Updated per comments */
            console.log(data);

            var link = document.createElement("a");
            link.target = "blank";
            link.download = "someFile";//data.name
            console.log(link.download);
            link.href = "http://localhost:23968/svc/OrderServices/GetFile/demo.xml";//data.uri;
            link.click();
        });
        event.preventDefault();
    });
    $('#formXmlTest').submit();
};

//Updated per comments
/* 
[System.Web.Mvc.HttpPost]
public void GetXml([FromBody] string[] orders)
{
    //same code to generate xml string
    var documentStream = MemStreamMgmt.StringToMemoryStream(formattedXml);
    byte[] _documentXMLFile = documentStream.ToArray();

    //SendXml(_documentXMLFile);
    string _xmlDocument = System.Text.Encoding.UTF8.GetString(_documentXMLFile);

    XDocument _xdoc = XDocument.Parse(_xmlDocument);
    var _dcpXMLSchema = new XmlSchemaSet();
    _dcpXMLSchema.Add("", Server.MapPath(@"~/Orders/DCP.xsd"));
    bool _result = true;
    try
    {
        _xdoc.Validate(_dcpXMLSchema, null);
    }
    catch (XmlSchemaValidationException)
    {
        //validation failed raise error
        _result = false;
    }

    Response.ClearContent();
    Response.Clear();
    Response.ContentType = "text/plain";
    Response.AddHeader("Content-disposition", "attachment; filename=" + "XMLOrdersExported_" + string.Format("{0:yyyy-MM-dd_hh-mm-ss-tt}.xml", DateTime.Now));
    Response.BinaryWrite(_documentXMLFile);
    Response.Flush();
    //Context.ApplicationInstance.CompleteRequest();
    Response.End();
    }
}*/
[System.Web.Mvc.HttpPost]
public FileResult GetXmlAsFile([FromBody] string[] orders)
{
    var schema = Server.MapPath(@"~/Orders/DCP.xsd");
    var formattedXml = OrderXmlFormatter.GenerateXmlForSelectedOrders(orders, schema);
    var _result = validateXml(formattedXml.DocumentXmlFile, schema);

    // return error message
    if (!_result)
    {
        const string message = "The XML File(s) are not valid! Please check with your administrator!.";
        return null;
    }
    var cd = new System.Net.Mime.ContentDisposition
    {
        FileName = "blargoWargo.xml",
        Inline = false
    };
    System.IO.File.WriteAllBytes(Server.MapPath("~/temp/demo.xml"),formattedXml.DocumentXmlFile);
    return File(formattedXml.DocumentXmlFile,MediaTypeNames.Text.Plain,"blarg.xml");
}

[System.Web.Mvc.HttpGet]
public FileResult GetFile(string fileName)
{
    var cd = new System.Net.Mime.ContentDisposition
    {
        // for example foo.bak
        FileName = fileName,
        Inline = false
    };
    Response.AppendHeader("Content-Disposition", cd.ToString());
    var fName = !string.IsNullOrEmpty(fileName)?fileName:"demo.xml";
    var fArray = System.IO.File.ReadAllBytes(Server.MapPath("~/temp/" + fName));
    System.IO.File.Delete(Server.MapPath("~/temp/" + fName));
    return File(fArray, MediaTypeNames.Application.Octet);
}
queueModel.getXmlForSelectedOrders=函数(){
//创建要提交的表单
$('body')。追加('');
//提交处理程序
$('#formXmlTest').submit(函数(事件){
var orderNbrs=queueModel.selectedItems().map(函数(e){返回e.OrderId()});
console.log(orderNbrs);
var ordersForXml=orderNbrs;
var urlx=”http://localhost:1234/svc/OrderServices/GetXml";
$.ajax({
url:urlx,
键入:“POST”,
数据:{orders:ordersForXml},
数据类型:“xml”,
接受:{
xml:'application/xhtml+xml',
文本:“文本/普通”
}
}).完成(功能(数据){
/*根据评论更新*/
控制台日志(数据);
var link=document.createElement(“a”);
link.target=“blank”;
link.download=“someFile”//data.name
console.log(link.download);
link.href=”http://localhost:23968/svc/OrderServices/GetFile/demo.xml“;//data.uri;
link.click();
});
event.preventDefault();
});
$(#formXmlTest')。提交();
};
//根据评论更新
/* 
[System.Web.Mvc.HttpPost]
public void GetXml([FromBody]string[]orders)
{
//生成xml字符串的代码相同
var documentStream=MemStreamMgmt.StringToMemoryStream(格式化XML);
字节[]_documentXMLFile=documentStream.ToArray();
//SendXml(_documentXMLFile);
string _xmlDocument=System.Text.Encoding.UTF8.GetString(_documentXMLFile);
XDocument _xdoc=XDocument.Parse(_xmlDocument);
varu dcpXMLSchema=newxmlschemaset();
_dcpXMLSchema.Add(“,Server.MapPath(@“~/Orders/DCP.xsd”);
bool_结果=真;
尝试
{
_验证(_dcpXMLSchema,null);
}
捕获(XmlSchemaValidationException)
{
//验证失败,引发错误
_结果=假;
}
Response.ClearContent();
Response.Clear();
Response.ContentType=“text/plain”;
Response.AddHeader(“内容处置”、“附件;文件名=“+”XmlOrdersPorted_uzy”+string.Format(“{0:yyyy-MM-dd_hh-MM-ss-tt}.xml”,DateTime.Now));
BinaryWrite(_documentXMLFile);
Response.Flush();
//Context.ApplicationInstance.CompleteRequest();
Response.End();
}
}*/
[System.Web.Mvc.HttpPost]
public FileResult GetXmlAsFile([FromBody]string[]orders)
{
var schema=Server.MapPath(@“~/Orders/DCP.xsd”);
var formattedXml=OrderXmlFormatter.GenerateXmlForSelectedOrders(orders,schema);
var_result=validateXml(formattedXml.DocumentXmlFile,schema);
//返回错误消息
如果(!\u结果)
{
const string message=“XML文件无效!请与管理员联系!”;
返回null;
}
var cd=new System.Net.Mime.ContentDisposition
{
FileName=“blargoWargo.xml”,
内联=假
};
System.IO.File.writealBytes(Server.MapPath(“~/temp/demo.xml”),formattedXml.DocumentXmlFile);
返回文件(formattedXml.DocumentXmlFile,MediaTypeNames.Text.Plain,“blarg.xml”);
}
[System.Web.Mvc.HttpGet]
公共文件结果GetFile(字符串文件名)
{
var cd=new System.Net.Mime.ContentDisposition
{
//例如foo.bak
FileName=FileName,
内联=假
};
AppendHeader(“内容处置”,cd.ToString());
var fName=!string.IsNullOrEmpty(文件名)?文件名:“demo.xml”;
var fArray=System.IO.File.ReadAllBytes(Server.MapPath(“~/temp/”+fName));
System.IO.File.Delete(Server.MapPath(“~/temp/”+fName));
返回文件(fArray、MediaTypeNames.Application.Octet);
}
更新: 我只是将AS-IS/TO-BE并排放在一起,并且在dev工具中验证了唯一的区别(至少就dev工具所示),即TO-BE的ACCEPT:header是:

应用程序/xhtml+xml,/;q=0.01

而AS-IS的标题是

text/html,application/xhtml+xml,image/jxr,/

更新II 我发现了一种解决方法,它使用带有超链接的两步流程。这是一个复杂的解决方案,但正如我所怀疑的,显然在进行ajax调用(至少是jQuery ajax调用,而不是直接的XmlHttpRequest)时,不可能触发打开/保存对话框。因此,在POST步骤中,我创建并保存所需的文件,然后在GET步骤(使用动态创建的链接)中,我将文件发送到客户机,并将其从服务器中删除。我
queueModel.getXmlForSelectedOrders = function () {
    //create form to submit
    $('body').append('<form id="formXmlTest"></form>');

    //submit handler
    $('#formXmlTest').submit(function(event) {
        var orderNbrs = queueModel.selectedItems().map(function (e) { return e.OrderId() });
        console.log(orderNbrs);
        var ordersForXml = orderNbrs;
        var urlx = "http://localhost:1234/svc/OrderServices/GetXml";
        $.ajax({
            url: urlx,
            type: 'POST',
            data: { orders: ordersForXml },
            dataType: "xml",
            accepts: {
                xml: 'application/xhtml+xml',
                text: 'text/plain'
            }
        }).done(function (data) {
              /*Updated per comments */
            console.log(data);

            var link = document.createElement("a");
            link.target = "blank";
            link.download = "someFile";//data.name
            console.log(link.download);
            link.href = "http://localhost:23968/svc/OrderServices/GetFile/demo.xml";//data.uri;
            link.click();
        });
        event.preventDefault();
    });
    $('#formXmlTest').submit();
};

//Updated per comments
/* 
[System.Web.Mvc.HttpPost]
public void GetXml([FromBody] string[] orders)
{
    //same code to generate xml string
    var documentStream = MemStreamMgmt.StringToMemoryStream(formattedXml);
    byte[] _documentXMLFile = documentStream.ToArray();

    //SendXml(_documentXMLFile);
    string _xmlDocument = System.Text.Encoding.UTF8.GetString(_documentXMLFile);

    XDocument _xdoc = XDocument.Parse(_xmlDocument);
    var _dcpXMLSchema = new XmlSchemaSet();
    _dcpXMLSchema.Add("", Server.MapPath(@"~/Orders/DCP.xsd"));
    bool _result = true;
    try
    {
        _xdoc.Validate(_dcpXMLSchema, null);
    }
    catch (XmlSchemaValidationException)
    {
        //validation failed raise error
        _result = false;
    }

    Response.ClearContent();
    Response.Clear();
    Response.ContentType = "text/plain";
    Response.AddHeader("Content-disposition", "attachment; filename=" + "XMLOrdersExported_" + string.Format("{0:yyyy-MM-dd_hh-mm-ss-tt}.xml", DateTime.Now));
    Response.BinaryWrite(_documentXMLFile);
    Response.Flush();
    //Context.ApplicationInstance.CompleteRequest();
    Response.End();
    }
}*/
[System.Web.Mvc.HttpPost]
public FileResult GetXmlAsFile([FromBody] string[] orders)
{
    var schema = Server.MapPath(@"~/Orders/DCP.xsd");
    var formattedXml = OrderXmlFormatter.GenerateXmlForSelectedOrders(orders, schema);
    var _result = validateXml(formattedXml.DocumentXmlFile, schema);

    // return error message
    if (!_result)
    {
        const string message = "The XML File(s) are not valid! Please check with your administrator!.";
        return null;
    }
    var cd = new System.Net.Mime.ContentDisposition
    {
        FileName = "blargoWargo.xml",
        Inline = false
    };
    System.IO.File.WriteAllBytes(Server.MapPath("~/temp/demo.xml"),formattedXml.DocumentXmlFile);
    return File(formattedXml.DocumentXmlFile,MediaTypeNames.Text.Plain,"blarg.xml");
}

[System.Web.Mvc.HttpGet]
public FileResult GetFile(string fileName)
{
    var cd = new System.Net.Mime.ContentDisposition
    {
        // for example foo.bak
        FileName = fileName,
        Inline = false
    };
    Response.AppendHeader("Content-Disposition", cd.ToString());
    var fName = !string.IsNullOrEmpty(fileName)?fileName:"demo.xml";
    var fArray = System.IO.File.ReadAllBytes(Server.MapPath("~/temp/" + fName));
    System.IO.File.Delete(Server.MapPath("~/temp/" + fName));
    return File(fArray, MediaTypeNames.Application.Octet);
}