首页 > 解决方案 > 模型在 PartialAsync 调用上填充,但在部分视图 C# Razor ASPCORE 上为空

问题描述

由于我正在使用的库的限制,我正在创建部分模型异步。我调用部分并返回一个包含我的progressModel 数据的模型。模型的 ProgressModel 在离开服务器时有数据,当它到达部分时,我得到一个对象引用空错误。

  Error:
  System.NullReferenceException
  HResult=0x80004003
  Message=Object reference not set to an instance of an object.
  Source=NGL.Dashboard.Razor.Views
  StackTrace:
  at 
  NGL.Dashboard.Razor.Pages.Pages__WorkflowProgressBarPartial.get_Model()

部分注射:

@await Html.PartialAsync("/Pages/_WorkflowProgressBarPartial.cshtml", 
PartialModel.OnPostUseMyClassAsync(log, mapper, options, workflowInstanceId).Result)

部分页面模型:

  public class _WorkflowProgressBarPartialModel : PageModel
  {
    [BindProperty]
    public ProgressModel progressModel { get; set; }


    // https://blog.stephencleary.com/2013/01/async-oop-2-constructors.html //
    public sealed class ProgressModel {
        public WorkflowInstanceController WIC;
        public IWorkflowInstanceStore workflowInstanceStore;
        public IWorkflowDefinitionStore workflowDefinitionStore;
        public ElsaDashboardOptions _options { get; }
        public INotifier notifier;
        private ILogger _log;
        private IMapper _mapper;
        [BindProperty]
        public string WorkFlowInstanceId { get; set; }
        [BindProperty]
        public WorkflowInstanceDetailsModel WorkflowDetailsModel { get; set; }
        
        private ProgressModel(ILogger log, IMapper mapper, IOptions<ElsaDashboardOptions> options, string workFlowInstanceId)
        {
            _log = log;
            _mapper = mapper;
            WorkFlowInstanceId = workFlowInstanceId;
            WorkflowDataAccess da = new WorkflowDataAccess(_log);
            ElsaContext _elsaContext = da.GetElsaContext();
            workflowInstanceStore = new EntityFrameworkCoreWorkflowInstanceStore(_elsaContext, _mapper);
            workflowDefinitionStore = new EntityFrameworkCoreWorkflowDefinitionStore(_elsaContext, _mapper);
            notifier = new Notifier();

            WIC = new WorkflowInstanceController(
            workflowInstanceStore,
            workflowDefinitionStore,
            options,
            notifier);
        }

        private async Task<ProgressModel> InitializeAsync(string workFlowInstanceId)
        {
            WorkflowDetailsModel = await WfDetailsModel(workFlowInstanceId);
            return this;
        }

        public static Task<ProgressModel> CreateAsync(ILogger log, IMapper mapper, IOptions<ElsaDashboardOptions> options, string workFlowInstanceId)
        {
            var ret = new ProgressModel(log, mapper, options, workFlowInstanceId);
            return  ret.InitializeAsync(workFlowInstanceId);
        }
        public async Task<WorkflowInstanceDetailsModel> WfDetailsModel(string workFlowInstanceId)
        {
            System.Threading.CancellationToken cancellationToken = default;
            WorkflowInstanceDetailsModel DetailsModel = (WorkflowInstanceDetailsModel)await WIC.DetailsModel(workFlowInstanceId, cancellationToken);
            WorkflowDetailsModel = DetailsModel;
            return DetailsModel;
        }
    }
    public async Task<_WorkflowProgressBarPartialModel> OnPostUseMyClassAsync(ILogger log, IMapper mapper, IOptions<ElsaDashboardOptions> options, string workFlowInstanceId)
    {
        _WorkflowProgressBarPartialModel model = new _WorkflowProgressBarPartialModel();
        ProgressModel instance = await ProgressModel.CreateAsync(log, mapper, options, workFlowInstanceId);
        model.progressModel = instance;
        
        return model;

    }

}

部分的:

    @Page
    @model NGL.Dashboard.Razor.Pages._WorkflowProgressBarPartialModel
    @using System.Globalization

    <div class="table-responsive">
    <table class="table align-items-center table-flush">
    <thead class="thead-light">
        <tr>
            <th scope="col">Timestamp</th>
            <th scope="col">Activity ID</th>
            <th scope="col">Message</th>
        </tr>
    </thead>
    <tbody>
        @if (Model != null)
        {
     foreach (var item in Model.progressModel)
            {
           var statusClass = item.Faulted ? "bg-warning" : "bg- success";
                var message = item.Faulted ? item.Message : "";

                <tr data-activity-id="@item.ActivityId">
                    <td>
                        <span class="badge badge-dot mr-4">
                            <i class=@statusClass></i>
                        </span>
               @item.Timestamp.ToString("g", CultureInfo.CurrentCulture)
                    </td>
                    <td>@item.ActivityId</td>
                    <td>@message</td>
                </tr>
            }
        }
    </tbody>
</table>
.

标签: c#asp.net-corerazormodelrazor-pages

解决方案


我不得不删除@Page,现在它可以工作了!

如果要使用局部视图,可以参考官方文档,局部视图在视图中没有@page。这样就不会使用xx.cshtml.cs。——尤依依


推荐阅读