Как я могу перевести модель в Razor компонент в Blazor стороне сервера?

голоса
0

Я использую Blazor на стороне сервера, чтобы сделать чат.

Для стиля получения сообщения и отправки сообщения различен, я сделал модель по имени 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; }
    }
}

Компоненты бритвы ReceiveMsg.razorи SendMsg.razorбазисные на этой модели.

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


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

В index.razor, я хочу вводить текст сообщения и отобразить его немедленно.

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

Теперь проблема: в forблоке, я должен передать _MsgModelкомпоненту. В то же время, я не знаю , как передать его еще.

Не могли бы вы мне помочь? Спасибо.

Задан 09/10/2019 в 13:02
источник пользователем
На других языках...                            


1 ответов

голоса
0

Наконец, я нашел странный и глупый способ решить эту проблему.

Добавить эти код в блок 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);
                }
            }
        }

И изменить forблок , как это:

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

Какой глупый способ это!

Ответил 09/10/2019 в 15:35
источник пользователем

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