[英]What is your prefered way to return XML from an ActionMethod in Asp.net MVC?
我正在显示异步加载数据的图表,因为搜索是获取数据的工作量很大。 数据必须以XML格式返回才能使图表库满意。
我的ActionMethods返回的ContentResult类型设置为text / xml。 我使用Linq to XML构建我的Xml并调用ToString。 这可以很好地工作,但不是理想的测试方法。
我有另一个实现此目的的想法,就是返回一个使用XSLT View引擎构建XML的视图。
我很好奇,我总是尝试以“正确的方式”做事。 那么你们如何处理这种情况?
您是否实现了其他ViewEngine(例如xslt)来构建XML,还是在控制器(或为控制器提供服务的服务)中构建XML?
编辑:
由于我需要这样做才能将数据传递到图表库,因此我必须遵循其xml结构 。 他们的符号根本不是我想要构建模型类的方式。 这就是为什么我自己使用Linq to XML构建XML并想知道模板是否会更好的原因。
简单的序列化不是我想要的
编写自定义操作结果:
public class XmlActionResult : ActionResult
{
public XmlActionResult(object data)
{
Data = data;
}
public object Data { get; private set; }
public override void ExecuteResult(ControllerContext context)
{
context.HttpContext.Response.ContentType = "text/xml";
// TODO: Use your preferred xml serializer
// to serialize the model to the response stream :
// context.HttpContext.Response.OutputStream
}
}
在您的控制器动作中:
public ActionResult Index()
{
var model = _repository.GetModel();
return new XmlActionResult(model);
}
我使用自己的自定义ActionResult,您可以根据需要进行修改。
public class XmlDataResult : ActionResult
{
private readonly object _stringToConvertToXml;
public XmlDataResult(string stringToConvertToXml)
{
_stringToConvertToXml = stringToConvertToXml;
}
public object StringToConvertToXml
{
get { return _stringToConvertToXml; }
}
public override void ExecuteResult(ControllerContext context)
{
if (_stringToConvertToXml != null)
{
context.HttpContext.Response.Clear();
context.HttpContext.Response.ContentType = "text/xml";
context.HttpContext.Response.Write(_stringToConvertToXml);
}
}
}
假设您使用的是Linq to XML来组成响应XML,那么您可能想使用与我相同的方法。
我在action方法中创建一个XDocument
。
public ActionResult MyXmlAction()
{
// Create your own XDocument according to your requirements
var xml = new XDocument(
new XElement("root",
new XAttribute("version", "2.0"),
new XElement("child", "Hello World!")));
return new XmlActionResult(xml);
}
此可重用的自定义ActionResult
为您将XDocument
作为XML文本序列化到响应流。
public sealed class XmlActionResult : ActionResult
{
private readonly XDocument _document;
public Formatting Formatting { get; set; }
public string MimeType { get; set; }
public XmlActionResult(XDocument document)
{
if (document == null)
throw new ArgumentNullException("document");
_document = document;
// Default values
MimeType = "text/xml";
Formatting = Formatting.None;
}
public override void ExecuteResult(ControllerContext context)
{
context.HttpContext.Response.Clear();
context.HttpContext.Response.ContentType = MimeType;
using (var writer = new XmlTextWriter(context.HttpContext.Response.OutputStream, Encoding.UTF8) { Formatting = Formatting })
_document.WriteTo(writer);
}
}
您可以指定MIME类型(例如application/rss+xml
)以及是否需要缩进输出。 这两个属性都有合理的默认值。
如果您需要UTF8以外的编码,那么也可以为此添加一个属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.