2017-08-16 53 views
0

我有一個視圖,當視圖呈現時加載一組模塊(我們將說其他部分視圖)。在以前加載的剃刀部分視圖中更新模型值

所以認爲它像這樣在主視圖:

<div> 
    @Html.PartialView("~/Views/MyApp/Partials/Module1.cshtml"); 
</div> 
<div> 
    @Html.PartialView("~/Views/MyApp/Partials/Module2.cshtml"); 
</div> 
<div> 
    @Html.PartialView("~/Views/MyApp/Partials/Module3.cshtml"); 
</div> 

有是在局部視圖Module2.cshtml改變的模型值。實際上,它在Module2視圖的操作中發生了變化。我在public ActionResult RenderChecklist(Model pageModel, IGrouping<string, ChecklistItem> list, int checklistCount)設置模型值:

if (itemCounter == itemCheckedCounter) 
{ 
    priorityCounter++; 
    pageModel.MyAppInfo.ChecklistPriorityLevel = priorityCounter; 
    listRestrict = "no-restrict"; 
    overlayShow = "hidden"; 
} 
else 
{ 
    listRestrict = "no-restrict"; 
    overlayShow = "hidden"; 
} 

根據ChecklistPriorityLevel值確定在Module1顯示疊加,Module3等,但由於Module2之前Module1負載的ChecklistPriorityLevelModule1的價值始終爲0。

發起在被稱爲每個模塊中的局部視圖的代碼是這樣的:

@if (moduleRestrict && !(moduleRestrictPriorityLevel <= checklistPriority) && !Model.GetValue<bool>("moduleRestrictBypass")) 
{ 
    const string moduleLockMessage = "This section is locked."; 

    <div class="module overlay show"> 
     <img src="/assets/myapp/images/lock.png" alt="Module Lock"> 
     <p>@moduleLockMessage</p> 
    </div> 
} 

模型相對碼只是一個普通的獲取,設置在這一刻:

namespace MyApp.Core.MySite.Models 
{ 
    /// <summary> 
    ///  Model for MySite. 
    /// </summary> 
    public class MyAppInfoModel 
    { 
     ... //other models 

     [Ignore] 
     public int ChecklistPriorityLevel { get; set; } 
    } 
} 

所以我的問題是如何獲得這一模式的價值的變化來觸發其他模塊的變化(部分視圖)已經加載?

免責聲明:我爲了隱私目的更改了一些實際的代碼。我只是想提供足夠的信息讓觀衆瞭解我想要做的事情。我正在尋找最佳選擇,無論是異步還是其他任何方法,都可以正確地獲取其他部分視圖中的值,而不管首先加載哪些部分。

回答

0

修復了我自己的問題(但我還是很喜歡看這是怎麼處理)

所以對我特別的問題,我決定,我只想逼模型的值設置在加載任何模塊之前。我的應用程序的工作方式,Module2可以在任何地方,任何模塊可以在Module2之前或之後。在後臺確定模塊的順序。所以我決定創建一個SurfaceController並在主視圖中獲取數據(清單),但是必須在「Module2」中再次獲取數據,這是我的ChecklistModule。我不喜歡必須重複檢查清單兩次,但爲了獲得這個值,我必須遍歷檢查清單。

所以我的主要觀點通話以下:

MyAppChecklistController.SetChecklistPriorityLevel(Model); 

然後我的方法是:

public static void SetChecklistPriorityLevel(MyAppRenderModel pageModel) 
{ 
    var checklist = GetCheckList(pageModel); 
    var priorityCounter = 1; 

    foreach (var list in checklist) 
    { 
     var listCount = list.Count(); 
     var itemData = new ValueTuple<int, int, string>(1, 1, null); 

     itemData = list.OrderBy(x => x.IsChecked).ThenBy(x => x.SortOrder).Aggregate(itemData, 
      (current, item) => GetItemList(item, current.Item1, current.Item2, current.Item3, listCount)); 

     var itemCounter = itemData.Item1; 
     var itemCheckedCounter = itemData.Item2; 
     // var itemList = itemData.Item3; 

     priorityCounter = GetPriorityLevel(itemCounter, itemCheckedCounter, priorityCounter); 

     pageModel.ChecklistPriorityLevel = priorityCounter; 
    } 
} 

然後,當我呈現在ChecklistModule局部視圖的清單:

[ChildActionOnly] 
public ActionResult RenderChecklist(IGrouping<string, ChecklistItem> list, 
     int checklistCount, int checklistCounter, int priorityCounter) 
{ 
    var parentFolder = list.First().UmbracoContent.Parent; 
    var listCount = list.Count(); 
    var itemData = new ValueTuple<int, int, string>(1, 1, null); 
    var color = GetChecklistColorValue(parentFolder); 

    itemData = list.OrderBy(x => x.IsChecked).ThenBy(x => x.SortOrder).Aggregate(itemData, 
     (current, item) => GetItemList(item, current.Item1, current.Item2, current.Item3, listCount)); 

    var itemCounter = itemData.Item1; 
    var itemCheckedCounter = itemData.Item2; 
    var itemList = itemData.Item3; 

    var checklistDict = GetChecklistRestrictions(parentFolder, itemCounter, 
     itemCheckedCounter, priorityCounter); 

    checklistDict.Add("color", color); 
    checklistDict.Add("itemList", itemList); 
    checklistDict.Add("checklistCounter", checklistCounter); 

    return GetChecklistLayout(checklistCount, checklistLayoutDict); 
} 

所以你可以看到我幾乎在一個頁面加載中運行兩次檢查清單。我不想這樣做。如果任何人有更好的想法讓這個更高效,讓我知道。

UPDATE:上述解決方案(即使只有部分代碼張貼)固定我的問題,但我決定,我會正好趕上該清單上的觀點,並把它添加到型號太多,然後使用模型(pageModel.Checklists)在部分,所以我實際上並沒有用Linq兩次抓取清單。我仍然需要兩次檢查清單,但是我沒有兩次抓取這些值。所以更多的是黑客攻擊,但也許我會在稍後繼續尋找方法來精簡這一點。