2014-04-23 33 views
0

我正在使用C#MVC5和EF6構建一個博客應用程序。我在幾個地方使用SignalR,但現在正在嘗試設置它,以便主頁(顯示最新博客列表)的用戶自動將新博客添加到頂部(如果添加了一個博客,重新在頁面上。爲此,我設置了一個計時器,每隔60秒檢查一次數據庫,以查看自上次檢查以來是否添加了博客。如何從SignalR廣播中返回部分視圖?

//This is called every 60 seconds. 
public void CheckForNewBlogs(object state) 
{ 
    //check if there has been a new blogs since last check 
    List<BlogViewModel> blogs = blogRepo.GetBlogs().Where(a => a.Created > lastTimeChecked).Select(a => new BlogViewModel(a, user)).ToList(); 

    lastTimeChecked = DateTime.Now; 
    foreach (BlogViewModel blog in blogs) 
    { 
     BroadcastNewBlog(blog); 
    } 
} 

這是我的問題是,我可以創建新博客的模型時,有一個,但我不知道如何我然後創建通過SignalR發送到客戶端的局部視圖。

在使用SignalR的其他情況下,它都在Controller內,所以我使用了PartialViewToString函數。我是否必須創建控制器實例,還是有更好的方法?

任何幫助表示讚賞。謝謝。

回答

1

我不會通過SignalR推送視圖。我將推送一個事件,警告在給定的URL存在新博客文章的頁面,然後頁面可以按照通常的方式繼續獲取該頁面/視圖。

此外,我不會有計時器來檢查數據庫中是否有新東西。當創建一個新帖子時,作爲創作的最後一步,我會播放一個事件,指出新帖子像以前一樣存在。

要通過SignalR推送ASP.NET MVC生成的視圖,您必須嘲笑一個請求並經歷很多麻煩,這會導致無用的大量ASP.NET功能(如安全性)。此外,如果您通過SignalR推送視圖,則無法從HTTP緩存中獲益。

+0

對不起,我應該提到。博客通過一個單獨的系統添加到數據庫中,因此我無法使用創建事件來廣播該帖子。此外,我認爲這樣做意味着只有一個數據庫調用來創建博客,如果我發送URL,這意味着每個用戶在網站上的數據庫調用。記住你的提議。謝謝。 – AndrewPolland

+0

如果您恰當地使用輸出緩存,它也只會意味着一次調用DB。 – vtortola

+0

聽起來像一個計劃。謝謝。看看我現在能否以這種方式工作。 – AndrewPolland