c# - 在不缓存数据的情况下覆盖 ActionResult

标签 c# asp.net asp.net-mvc actionresult

我创建了一个派生自 ActionResultSitemapResult 类。它允许调用者添加任意数量的 URL 资源,然后以 XML 格式输出站点地图数据。

public class SitemapResult : ActionResult
{
    private List<SitemapUrl> SitemapItems;

    public SitemapResult()
    {
        SitemapItems = new List<SitemapUrl>();
    }

    public void AddUrl(string url, DateTime? lastModified = null, SitemapFrequency? frequency = null, double? priority = null)
    {
        AddUrl(new SitemapUrl(url, lastModified, frequency, priority));
    }

    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.ContentType = "text/xml; charset=utf-8";

        using (XmlWriter writer = XmlWriter.Create(context.HttpContext.Response.Output))
        {

            // TODO: Write sitemap data to output

        }
    }
}

问题在于类会存储所有 URL,直到 ExecuteResult() 被调用。如果我可以在添加每个 URL 时将它们写入响应,而不是将它们全部保存在内存中,然后一次写入所有内容,这似乎会更有效率。

有谁知道覆盖 ActionResult 以在响应可用时将数据写入响应的任何好示例?在这种情况下,我认为 ExecuteResult() 根本不需要写任何东西。

最佳答案

您要实现的目标是在 View (自定义 View )内构建模型……这不是一个好的做法……在 MVC 中, Controller 负责构建模型并将其传递给 View 。 . views 负责显示模型并且应该有尽可能少的逻辑。


It seems like it would be more efficient if I could write each URL to the response as they are added rather than hold them all in memory and then write every thing at once.

为什么?您需要将 SitemapItems 保存在内存中的某个位置,因此即使您将它们写入响应,它们仍会保留在内存中,直到您返回响应......我认为序列化会更有效将整个列表一次性转换为 XML,而不是单独序列化每个 SitemapUrl


关于 this pluralsight course 的问题有一个非常优雅的解决方案:

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

然后在 Controller 中构建模型,并将其传递给 View :

return new SitemapResult(SitemapItems);

如果你想直接写入响应,你可以在 Controller 中进行:

public MyController : controller
{
    public void GetSiteMapUrls()
    {
        XmlSerializer serializer = new XmlSerializer(SitemapItems.GetType());
        Response.ContentType = "text/xml";
        serializer.Serialize(Response.Output, SitemapItems);
    }
}

关于c# - 在不缓存数据的情况下覆盖 ActionResult,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53507035/

相关文章:

c# - .NET FileSystemWatcher 检测 NTFS 安全变化

javascript - 使用 BreezeJsexecuteQuery 处理 WebApi 抛出的异常(未处理的拒绝原因)

asp.net-mvc - 为什么我不能使用 Html.Helpers 在 ASP.NET MVC 表单中指定 `name` 属性?

c# - Json.NET 忽略字典中的空值

c# - 什么版本的 .Net 框架应该针对最终用户应用程序

asp.net - 在selectedindexchanged中的asp.net列表框不会触发事件

asp.net - 确定最接近的已知颜色

asp.net-mvc - 修复 igGrid 中的列应仅显示整行的单个 'Add New Row' 按钮

asp.net-mvc - Entity Framework 在插入前检查唯一性

c# - 从 HSL 值创建 C# 颜色