Hoe kan ik een model over te dragen aan een Razor Component in Blazor server-side?

stemmen
0

Ik gebruik Blazor server-side om een ​​chatroom te maken.

Voor de stijl van ontvangst van het bericht en het verzenden van het bericht is anders, ik maakte een model met de naam 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; }
    }
}

Het scheermes componenten ReceiveMsg.razoren SendMsg.razorzijn basis op dit model.

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


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

In het index.razor, ik wil het invoeren van de tekst van het bericht en onmiddellijk weer te geven.

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

Nu is het probleem: in het forblok, zou ik de overdracht van de _MsgModelaan de component. Ondertussen, ik weet niet hoe het nog te dragen.

Wilt u mij helpen? Dank je.

De vraag is gesteld op 09/10/2019 om 13:02
bron van user
In andere talen...                            


1 antwoorden

stemmen
0

Tot slot vond ik een vreemde en domme manier om dit op te lossen.

Ik voeg deze code in 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);
                }
            }
        }

En verander het forblok als volgt uit:

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

Wat een domme manier het is!

antwoordde op 09/10/2019 om 15:35
bron van user

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