То, чего вы пытаетесь достичь, - это построение вашей модели в представлении (пользовательском представлении) ... это не очень хорошая практика ... в MVC контроллеры отвечают за построение модели и передачу ее в представление.Представления отвечают за отображение модели и должны иметь как можно меньше логики.
Похоже, было бы более эффективно, если бы я мог записывать каждый URL-адрес в ответ по мере их добавления, а не хранить их все в памяти, а затем записывать все сразу.
Почему?Вам нужно хранить SitemapItems
где-то в памяти, поэтому даже если вы напишите их в ответ, они все еще будут храниться в памяти, пока вы не вернете ответ ... и я думаю, что было бы более эффективно сериализовать весь список в XMLза один раз, в отличие от сериализации каждого SitemapUrl
в отдельности.
Существует очень элегантное решение для вашего вопроса по этому универсальному курсу :
public class SitemapResult : ActionResult
{
private object _data;
public SitemapResult(object data)
{
_data = data;
}
public override void ExecuteResult(ControllerContext context)
{
// you can use reflection to determine object type
XmlSerializer serializer = new XmlSerializer(_data.GetType());
var response = context.HttpContext.Response;
response.ContentType = "text/xml";
serializer.Serialize(response.Output, _data);
}
}
И вы строите свою модель в контроллере и передаете ее в представление:
return new SitemapResult(SitemapItems);
Если вы хотите напрямую написать в ответ, вы можете сделать это в контроллере:
public MyController : controller
{
public void GetSiteMapUrls()
{
XmlSerializer serializer = new XmlSerializer(SitemapItems.GetType());
Response.ContentType = "text/xml";
serializer.Serialize(Response.Output, SitemapItems);
}
}