2013-07-30 27 views
1

我想掃描我的網站並編錄所有內容。要做到這一點,我需要將我所有的視圖轉換爲字符串(MVC 4)

  1. 找到所有意見(可能是因爲控制器/動作組合)
  2. 使我所有的意見爲字符串

要爬我自己網站,我已經實施了這個sitemap provider。所以我有一個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常用方法將每個視圖轉換爲字符串。

不幸的是,當你想渲染一個特定的視圖到一個字符串時,這會更好。當你事先不知道具體的模型/控制器。

結論:有沒有一種方法來呈現一個以字符串只具有控制器和動作的名稱作爲字符串?

+2

您可能會遍歷您的站點地圖節點並向您的URL發出您自己的System.Net.HttpClient請求(使用您擁有的控制器/操作名稱構建它們)。 –

+0

@ Moo-Juice,這是一個有趣的想法。我希望更優雅的東西(EASY),但會谷歌HttpClient看看我可以如何使用它來呈現我的意見。 – Renaissance

+0

可能需要查詢路由,以便您可以遍歷所有路由。即使你解決了這個問題:問題是當你的行爲需要參數/模型時,你會傳遞給他們什麼? – AaronLS

回答

1

最近有一篇文章Rick Strahl顯示瞭如何在Asp.NET之外渲染視圖。鑑於這篇文章,它看起來很簡單,你可以寫一個文件或字符串搜索purpouse。看一看!

+0

這非常有趣。我正在仔細觀察原始文章。我很高興看到原始文章中的「ViewRenderer」。這似乎是我的答案,但他使用了'ErrorController'類,我無法在任何文檔中找到... – Renaissance

+0

原始文章的參考文獻很好說如何將視圖呈現爲字符串。介紹時有一個鏈接。希望這可以幫助你! – Fals

+0

我懷疑「內部」方法不適用於我。這似乎要求模型通過。這就是我對每個View - Controller/Model類都沒有的。 – Renaissance

1

隨着所有的優點和缺點,我結束了過濾我的基地控制器的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將被寫入數據庫。我應該決定創造性的邏輯來選擇性地使用時間戳或頁面更新狀態進行數據庫更新。