Comment puis-je transférer un modèle à un composant Razor côté serveur dans Blazor?

voix
0

J'utilise côté serveur Blazor pour faire une salle de chat.

Pour le style de réception du message et l'envoi du message est différent, je fait un modèle nommé MsgModel

using Microsoft.AspNetCore.Components;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace BlazorApp1
{
    public class MsgModel: ComponentBase
    {
        public string MsgText { get; set; }
    }
}

Les composants de rasoir ReceiveMsg.razoret la SendMsg.razorbase sont sur ce modèle.

@inherits MsgModel
<h3>ReceiveMsg</h3>@MsgText    


 @inherits MsgModel
 <h3>SendMsg</h3>@MsgText        

Dans la index.razor, je veux saisir le texte du message et l' afficher immédiatement.

@page /

@foreach (MsgModel _MsgModel in MsgList)
{
    if (_MsgModel.GetType() == typeof(ReceiveMsg))
    {
        <ReceiveMsg></ReceiveMsg>
    }
    else
    {
        <SendMsg></SendMsg>
    }
}
<div id=inputDiv>
    <EditForm Model=_InputMsgModel OnValidSubmit=@SubmitText>
        <InputText @bind-Value=_InputMsgModel.MsgText />
    </EditForm>
</div>

@code{
    protected MsgModel _InputMsgModel { get; set; } = new MsgModel();
    protected List<MsgModel> MsgList { get; set; } = new List<MsgModel>();
     protected void SubmitText()
    {
        SendMsg _SendMsg = new SendMsg();
        _SendMsg.MsgText = _InputMsgModel.MsgText;
        MsgList.Add(_SendMsg);
    }
}

Maintenant , le problème est: dans le forbloc, je transférer _MsgModelau composant. Pendant ce temps, je ne sais pas comment transférer encore.

Pourriez vous m'aider s'il vous plait? Je vous remercie.

Créé 09/10/2019 à 13:02
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Enfin, j'ai trouvé une façon étrange et stupide pour résoudre ce problème.

Ajouter ce code dans le MsgModel:

[Parameter]
        public MsgModel TransferModel
        {
            set
            {
                CopyAll(value, this);
            }
        }
        private void CopyAll<T>(T source, T target)
        {
            var type = typeof(T);
            foreach (var sourceProperty in type.GetProperties())
            {
                if (sourceProperty.Name != "TransferModel")
                {
                    var targetProperty = type.GetProperty(sourceProperty.Name);
                    targetProperty.SetValue(target, sourceProperty.GetValue(source, null), null);
                }
            }
        }

Et changer le forbloc comme ceci:

@foreach (Models.MsgModel _MsgModel in MsgList)
    {
        if (_MsgModel.GetType() == typeof(ReceiveMsg))
        {
            <ReceiveMsg ShowFullImage="@ShowFullImage" TransferModel="_MsgModel"></ReceiveMsg>
        }
        else
        {
            <SendMsg ShowFullImage="@ShowFullImage" TransferModel="_MsgModel"></SendMsg>
        }
    }  

Quelle façon stupide, il est!

Créé 09/10/2019 à 15:35
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more