如何将模型转移到Blazor服务器端的Razor组件?

时间:2019-10-09 10:02:56

标签: asp.net-core .net-core blazor

我正在使用Blazor服务器端建立聊天室。

由于接收消息和发送消息的样式不同,我制作了一个名为import re contracts = soup.findAll('span', text=re.compile('.*:.*'))

的模型。
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转移到组件。同时,我还不知道如何转让。

你能帮我吗?谢谢。

1 个答案:

答案 0 :(得分: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>
        }
    }  

这是多么愚蠢的方式!