2015-11-26 42 views
4

我有一個MVC .NET應用程序與AngularJS。在我的路線提供商我使用MVC的控制器程序來檢索意見如下:AngularJS - 從.NET控制器生成視圖只執行一次

.when('/Units', { 
     templateUrl: 'Unit/Units' 
    }) 
    .when('/UnitsDetail', { 
     templateUrl: 'Unit/UnitsDetail' 
    }) 

我的.NET UnitController有以下方法:

[Authorize] 
    public ActionResult Units() 
    { 
     return View(); 
    } 

    [Authorize] 
    public ActionResult UnitsDetail() 
    { 
     ViewBag.reference = Guid.NewGuid().ToString().Substring(0, 6); 
     return View(); 
    } 

對於UnitsDetail視圖我需要的引用在UnitsDetail()方法中生成。

問題出現在我從Units到UnitsDetail幾次時。第一次調用UnitsDetail()方法並因此生成引用,但是如果我返回到Units並再次訪問UnitsDetail,則不會調用該方法,並且引用是相同的。我需要每次生成一個參考。

我知道我可以在客戶端使用JS生成它,或者從Angular向服務器發出AJAX請求,但是我真正想知道的是每次我去「#」時如何使Angular調用方法UnitsDetail()/UnitsDetail」。

謝謝!

+0

這只是一個瘋狂的猜測,但它可能是一些激進的瀏覽器緩存? – AndreySarafanov

+0

也許Angular只生成一次頁面,剩下的時間只顯示第一頁。我嘗試了不同的瀏覽器,他們都做了同樣的事情,但我沒有發現如何防止這種情況發生。 – davidivad

+0

似乎它必須在瀏覽器端解決http://stackoverflow.com/questions/23589843/disable-template-caching-in-angularjs-with-ui-router http://stackoverflow.com/questions/14718826/angularjs-disable-partial-caching-on-dev-machine – AndreySarafanov

回答

1

默認情況下,angular會緩存模板緩存中的所有視圖。

這是設計。

Angular期望視圖只是靜態HTML,動態部分使用{{dynamicScopeVariable}}代碼標記。 Angular將使用範圍對象來替換動態位。但靜態部分將從緩存中顯示。

第一次執行視圖時,視圖被緩存。

您有2個選項。其實只是一個從你的設計觀點來看是好的#2。

選項#1

禁用模板角緩存如下所示 https://stackoverflow.com/a/27432167/2794980

這意味着角將調用HTML動作在每次需要查看時間。

這不是使用angualar的最佳方式,但它會起作用。您還應該考慮性能方面。到目前爲止,對ASP.NET MVC應用程序最耗時的調用是動作調用。這個方法意味着,當你使用客戶端MVC框架時,你並沒有利用它的一個重要優點。

選項#2

使用angualar服務從後端獲得GUID。即下面的代碼。

ViewBag.reference = Guid.NewGuid().ToString().Substring(0, 6); 

最好使用WebAPI如果你可以(你的請求會很小)。在我們的VIEW中使用angular來替換GUID。

從問題中不清楚爲什麼您需要GUID,以及您是否可以使用Javascript生成隨機唯一編號。如果可能的話,這可能是最好的解決方案。但根據問題中的信息,您可以使用選項1或2中的任意一個。

編輯:沒有意識到你已經嘗試過選項2,在這種情況下,選項1是。

編輯2:如果你想從緩存中刪除一個元素,你可以做

$templateCache.remove("<Element Name>"); 

,或者您可以使用

$cacheFactory.remove("Name") 

瞭解更多關於緩存工廠在這裏: https://docs.angularjs.org/api/ng/service/ $ cacheFactory

該名稱一般是頁面名稱,可以在調試器中查看模板緩存或緩存工廠對象缺點ole找到確切的名字。

+0

感謝@Pratik我目前使用選項#2。我用引用變量作爲例子,我想知道的是如果可以確保調用Action方法。這就是爲什麼選項#1是有用的,但我知道這必須適用於整個應用程序。只爲這條路線禁用Angular緩存是否可行?或者是否有可能從緩存中清除此視圖的HTML?再次感謝! – davidivad

+1

@davidivad:更新了評論以顯示您可以執行的操作。 – Pratik

+0

非常感謝您的幫助!我會嘗試使用選項#2,因爲它是最合適的選項,但很好地瞭解其他選項。 – davidivad

相關問題