2010-04-07 5 views
2

검색을 통해 데이터를 가져 오는 작업이 매우 비중 있기 때문에 데이터를 비동기 적으로로드하는 차트가 표시됩니다. 차트 라이브러리를 행복하게 만들려면 데이터를 XML로 반환해야합니다.
내 ActionMethods는 text/xml로 설정된 유형의 ContentResult를 반환합니다. Linq를 사용하여 XML에 ToString을 호출하여 XML을 작성합니다. 이것은 잘 작동하지만 테스트하기에 이상적이지 않습니다.
XSLT View 엔진을 사용하여 XML을 빌드하는 뷰를 반환하는 것이 다른 아이디어입니다.Asp.net MVC의 ActionMethod에서 XML을 반환하는 가장 좋은 방법은 무엇입니까?

나는 궁금해서 항상 "올바른 방법"으로 작업하려고합니다. 그런 시나리오를 어떻게 다루고 있습니까?

XML을 작성하기 위해 다른 ViewEngine (xslt와 같은)을 구현합니까, 아니면 컨트롤러 (또는 컨트롤러를 제공하는 서비스)에 XML을 빌드합니까?

편집 :

내가하는 차트 라이브러리에 나는 그들의 XML 구조를 수행 할 필요가 의 데이터를 전달이 필요하기 때문에. 그들의 표기법은 내 모델 수업을 전혀 만들고 싶지 않다. 그래서 Linq를 사용하여 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 
    } 
} 

그리고 컨트롤러의 행동 :
간단한 직렬화 내가 사용자 지정 작업 결과 쓰기

+0

[ASP.NET MVC에서 컨트롤러의 동작에서 XML을 반환하는 가장 좋은 방법은 무엇입니까?] (http://stackoverflow.com/questions/134905/what-is-the-best-way-to -return-xml-from-a-controllers-action-in-asp-net-mvc) –

답변

5

찾는 것이 아니다

public ActionResult Index() 
{ 
    var model = _repository.GetModel(); 
    return new XmlActionResult(model); 
} 
+0

데이터를 차트 라이브러리에 전달하기 때문에 xml 표기법을 따라야합니다. 이 표기법은 모델 클래스를 작성하는 방식이 아닙니다. 그래서 Linq를 사용하여 XML을 직접 작성하고 템플릿이 더 좋을지 궁금합니다. 간단한 직렬화는 내가 찾지 않는 것입니다 –

+0

그럼 XML 시리얼 라이저를 사용하지 마십시오.ExecuteResult 메서드에서 모델을 호환 XML로 변환하려면 원하는 것을 사용하십시오. –

+0

다른 XML 구조가 필요한 다른 유형의 그래프가 있기 때문에 매우 구체적인 ActionResult가됩니다. 그러나 그것은 여전히 ​​훨씬 더 좋고 검증 가능합니다. 감사! –

1

난 내 자신의 사용자 정의 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); 
      } 
     } 
    } 
0

응답 XML을 작성하기 위해 Linq to XML을 사용한다고 가정 할 때, 내가하는 것과 동일한 접근 방식을 사용하는 것이 좋습니다.

조치 방법에 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 텍스트를 serialises.

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); 
    } 
} 

당신은 (예 : application/rss+xml로) 당신이 필요한 경우 출력을 들여해야하는지 여부를 MIME 형식을 지정할 수 있습니다. 두 속성 모두 적절한 기본값을 갖습니다.

UTF8 이외의 인코딩이 필요한 경우에도 속성을 추가하는 것이 간단합니다.

관련 문제