2017-07-21 1 views
0

Ich versuche, einige dynamische Logik für unsere Anwendung zu machen, aber Komponente nicht kooperieren wollen. DieseSchwierigkeiten mit Bussiness Pack Alert Komponente

ist MasterpaDE Ansichtsmodell:

public class AdminMasterPageViewModel : DotvvmViewModelBase 
{ 
    public virtual AlertComponent AlertComponent { get; set; } 
    public DotVVM.BusinessPack.Controls.AlertType AlertType { get; set; } 

    public AdminMasterPageViewModel() 
    { 
    } 

    public override Task Init() 
    { 
     InitAlertComponents(); 
     return base.Init(); 
    } 

    private void InitAlertComponents() 
    { 
     AlertComponent = new AlertComponent 
     { 
      IsDisplayed = false, 
      Text = "Default", 
      Type = AlertComponent.Types.Info 
     }; 

     AlertType = DotVVM.BusinessPack.Controls.AlertType.Info; 
    } 

} 

Dies ist dothtml in Master:

<%--MAIN CONTENT BY PLACEHOLDER--%> 
    <div class="content-wrapper"> 

     <bp:Alert Type="{value: AlertType}" 
        IsDisplayed="{value: AlertComponent.IsDisplayed}" 
        AllowDismiss="true" 
        Text="{value: AlertComponent.Text}" 
        AutoHideTimeout="3" /> 

     <dot:ContentPlaceHolder ID="MainContent" /> 
    </div> 

In "Child" Viewmodel Ich habe dieses Ereignis:

public async void SaveUserRoleGroup() 
    { 
     UserRoleGroupDetailDTO.AppRoleForUserRoleGroupListDTOs = AppRoleListDTOs.Items.Where(i => i.IsAllowed = true).ToList(); 

     AlertComponent = await userRoleGroupDetailFacade.CreateUserRoleGroupAsync(UserRoleGroupDetailDTO); 

    } 

meine Klasse Representer für Diese Komponente ist:

public class AlertComponent 
{ 
    public bool IsDisplayed { get; set; } 
    public string Text { get; set; } 
    public Types Type { get; set; } 
    public enum Types 
    { 
     Success, Info, Warning, Danger 
    } 
} 

Und schließlich meine Fassade Funktion:

public async Task<AlertComponent> CreateUserRoleGroupAsync(UserRoleGroupDetailDTO dto) 
    { 
     using (var uow = unitOfWorkProvider.Create()) 
     { 
      try 
      { 
       var userRoleGroup = Mapper.Map<UserRoleGroup>(dto); 
       userRoleGroup.PortalSetting = portalSettingRepository.GetById(1); 

       repository.Insert(userRoleGroup); 

       await uow.CommitAsync(); 
      } 
      catch (Exception e) 
      { 
       return new AlertComponent 
       { 
        Text = "Error", 
        IsDisplayed = true, 
        Type = AlertComponent.Types.Danger 
       }; 
      } 
     } 
     return new AlertComponent 
     { 
      Text = "Success", 
      IsDisplayed = true, 
      Type = AlertComponent.Types.Success 
     }; 
    } 

Wie Sie sehen können, ich AlertComponent in SaveUserRoleGroup Funktion setze, aber in Browser nichts passieren. Ich vermisse das Ändern von AlertType, aber es ist egal, es hat immer noch als Standard "AlertType" Info, die ich in MasterViewModel eingestellt habe. Warum also Alert doenst zeigen und nicht funktioniert?

Vielen Dank für die Antwort

+0

Die Verwendung von 'async void' in Methoden, die über Befehle auf der Seite aufgerufen werden, ist keine gute Idee, da DotVVM nicht warten kann, bis der Vorgang beendet ist. öffentliche async Leere SaveUserRoleGroup() {...} sollten Sie öffentliche async Aufgabe SaveUserRoleGroup() verwenden, {...} –

Antwort

0

Sie Benachrichtigungstyp AlertType Eigenschaft binden, die Sie nur in Ansichtsmodell Init gesetzt. Wenn Sie AlertComponent später ändern, haben Sie AlertType nicht eingerichtet.

Oder können Sie ein litle Trick

public AlertType AlertType => (AlertType)AlertComponent.Type; 

verwenden Wir sollten DotVVM.BusinessPack zwei nuget Paket aufgeteilt. Eines mit Core-Typen und eins mit dotvvm-Abhängigkeit.

+0

gelöst. Vielen Dank. –