如何将XML作为输出参数返回到控制器

本文关键字:参数 返回 控制器 输出 XML | 更新日期: 2023-09-27 18:07:45

我试图将查询的结果返回到c# . net MVC4控制器作为XML字符串。据我所知,在不首先将XML转换为varchar之前,不允许将XML作为输出参数发送到控制器。我在使用FOR XML AUTO将输出XML的SELECT语句转换为可以作为输出参数传递的varchar时遇到了语法问题。

下面是一些程序代码:

set @sql='select StatusId from TestTable where StatusId = 3 FOR XML AUTO'
EXECUTE sp_executesql @sql

这个例子没有正确使用' sp_executesql,但我只是想要一个快速的例子。如何将结果返回给控制器?

如何将XML作为输出参数返回到控制器

我不确定是否被允许发送XML到控制器;然而,对你的场景做出一些假设(因为这个问题有点模糊),我确实得到了一个全新的MVC5项目的输出(我认为没有理由相信这不会在MVC4中工作)。

复制步骤:

我在SSMS中创建了一个表:
    use test; -- a testing database I leave lying about
    create table TestTable(StatusId int, SomeStuff nvarchar(max));
2)
    insert into TestTable(StatusId, SomeStuff) values (3, 'foo bar quux');
    insert into TestTable(StatusId, SomeStuff) values (4, 'some other stuff');

3)我写了一个过程来获取数据;具体来说,我想看看如果我得到多个结果会发生什么,因此我的小分歧从你的例子sql:

    create procedure sp_xmlresult as
    begin
        declare @sql nvarchar(max);
        set @sql='select * from TestTable where StatusId in(3,4) FOR XML AUTO, ROOT(''results'')'
        EXECUTE sp_executesql @sql
    end;

3)在我的MVC HomeController,我添加一些代码像这样:

    public ActionResult Index()
    {
        var builder = new SqlConnectionStringBuilder();
        builder.DataSource = "localhost";
        builder.IntegratedSecurity = true;
        builder.InitialCatalog = "test";
        XDocument doc = null;
        using (var conn = new SqlConnection(builder.ConnectionString))
        {
            conn.Open();
            using (var cmd = conn.CreateCommand())
            {
                cmd.CommandText = "exec sp_xmlresult";
                using (var reader = cmd.ExecuteReader())
                {
                    if (reader.Read())
                        doc = XDocument.Parse(reader[0].ToString());
                }
            }
        }
        return View(doc);
    } 

4)现在,我想看看我得到了什么:我设置了索引。使用XDocument作为模型,并将转义后的字符串表示形式放在这里:

   @model System.Xml.Linq.XDocument
   ...
   @{ Write(Model.ToString()); }

,我在我的页面中看到这样的输出:& lt; results>& lt;/results>

特别有趣的是,您可能想要包含

, ROOT(''results'')'

是我在上面概述的过程的一部分——否则SQL Server返回的文档每个结果有一个节点,没有根节点,所以XDocument解析它会很糟糕。

我想一个更现实的项目应该是在Index()操作中对XML做一些有趣的事情,但到目前为止我已经完全没有想象力了。