将我的所有视图转换为字符串(MVC 4)

本文关键字:字符串 MVC 转换 我的 视图 | 更新日期: 2023-09-27 18:25:43

我正在尝试扫描我的网站并对所有内容进行编目。要做到这一点,我需要

  1. 查找所有视图(可能是控制器/操作组合)
  2. 将我的所有视图渲染为字符串

为了抓取我自己的网站,我已经实现了这个网站地图提供商。所以我有一个类似于这样的xml文件:

<?xml version="1.0" encoding="utf-8" ?>
<mvcSiteMap xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0"
 enableLocalization="false">
  <mvcSiteMapNode title="Home" controller="Home" action="Index"
 changeFrequency="Always" updatePriority="Normal">
  <mvcSiteMapNode title="Dashboard" controller="Home" action="Dashboard"/>
  <mvcSiteMapNode title="My Profile" controller="Profile" action="MyProfile"/>
  <mvcSiteMapNode title="My Jobs" controller="Profile" action="MyJobs"/>
 </mvcSiteMapNode>
</mvcSiteMap>

我可以使用linq-xml将其转换为列表。

我打算使用RenderViewToString通用方法将每个视图转换为字符串。

不幸的是,当您希望将特定视图渲染为字符串时,这种方法效果更好。当您事先不知道具体型号/控制器时。

最后:是否有一种方法可以将视图呈现为仅将控制器和操作名称作为字符串的字符串?

将我的所有视图转换为字符串(MVC 4)

Rick Strahl最近发布了一篇文章,展示了如何在Asp.NET之外呈现视图。鉴于这篇文章,它看起来非常简单,你可以编写一个文件或字符串来搜索目的。看一看!

使用所有优点和缺点,我最终覆盖了基本控制器的OnResultExecuted,以在每次用户访问页面时捕获渲染的html。

protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
    var viewResult = filterContext.Result as ViewResult;
    var controller = filterContext.Controller;

    using (StringWriter sw = new StringWriter())
    {
        ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
        viewResult.View.Render(viewContext,sw);
        string s = sw.ToString();
    }  

    base.OnResultExecuted(filterContext);
}

呈现的HTML将被写入数据库。我可能应该决定创造性的逻辑,有选择地使用时间戳或页面更新状态进行数据库更新。