2017-08-16 1 views
0

J'ai une vue qui charge un ensemble de modules (nous dirons d'autres vues partielles) lorsque la vue est rendue.Valeur de modèle de mise à jour dans un rasoir précédemment chargé Vue partielle

Alors, pensez comme ça dans la vue principale:

<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> 

Il y a une valeur de modèle qui est modifié dans la vue partielle Module2.cshtml. En fait, il est modifié dans l'action pour la vue Module2. Je suis en train de la valeur du modèle dans 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"; 
} 

En fonction de la valeur ChecklistPriorityLevel est détermine si une superposition est montrée dans Module1, Module3, etc., mais étant donné que Module1 charges avant Module2, la valeur de ChecklistPriorityLevel dans Module1 est toujours initiée à 0.

le code dans la vue partielle qui est appelé dans chaque module est quelque chose comme ceci:

@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> 
} 

Le code relatif dans le modèle est juste un get régulier, fixé à ce moment:

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

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

Donc, ma question est de savoir comment puis-je obtenir le changement de la valeur de ce modèle pour déclencher le changement dans d'autres modules (vues partielles) qui ont déjà été chargées?

AVIS DE NON-RESPONSABILITÉ: J'ai changé une partie de mon code actuel à des fins de confidentialité. J'essaie juste de donner assez d'informations pour que les téléspectateurs comprennent ce que j'essaie de faire. Je suis à la recherche de la meilleure option, qu'elle soit asynchrone, ou autre, pour obtenir correctement la valeur dans d'autres vues partielles, indépendamment des partiels qui se chargent en premier.

Répondre

0

Fix pour mon propre problème (mais je voudrais encore vraiment voir comment cela pourrait être manipulé)

Donc, pour mon problème particulier, je décide que je voudrais juste forcer la valeur du modèle à régler avant de charger l'un des modules. Le fonctionnement de mon application, Module2 pourrait être dans n'importe quel endroit, et tous les modules pourraient être en avance ou en retard sur Module2. L'ordre dans lequel se trouvent les modules est déterminé dans le backoffice. J'ai donc décidé de créer un SurfaceController et d'obtenir les données (checklists) sur la vue principale, mais ensuite je dois récupérer les données dans "Module2", qui est mon ChecklistModule. Je n'aime pas vraiment devoir répéter deux fois les listes de vérification, mais pour obtenir cette valeur, je dois parcourir les listes de vérification.

donc à mon avis principal un appel comme suit:

MyAppChecklistController.SetChecklistPriorityLevel(Model); 

Ensuite, ma méthode est la suivante:

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; 
    } 
} 

Puis, quand je rends la liste de contrôle dans la vue partielle 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); 
} 

Donc, comme vous pouvez le voir, je suis en train de parcourir la liste de contrôle deux fois en une seule page. Je ne voulais pas avoir à faire ça. Si quelqu'un a une meilleure idée pour rendre cela plus efficace, faites le moi savoir.La solution ci-dessus (même si seule une partie du code est postée) a résolu mon problème, mais j'ai décidé d'attraper la liste de contrôle sur la vue et de l'ajouter aux modèles, puis de l'utiliser. model (pageModel.Checklists) dans le partiel, donc je ne saisis pas la checklist deux fois avec Linq. Je dois encore parcourir deux fois les listes de vérification, mais je ne saisis pas les valeurs deux fois. Donc encore plus d'un hack, mais peut-être que je vais continuer à trouver un moyen plus tard pour rationaliser cela.