如何将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到控制器;然而,对你的场景做出一些假设(因为这个问题有点模糊),我确实得到了一个全新的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>
特别有趣的是,您可能想要包含
, ROOT(''results'')'
是我在上面概述的过程的一部分——否则SQL Server返回的文档每个结果有一个节点,没有根节点,所以XDocument解析它会很糟糕。
我想一个更现实的项目应该是在Index()操作中对XML做一些有趣的事情,但到目前为止我已经完全没有想象力了。