Kendo UI ASP.NET Core: исключение NullReferenceException в пользовательском шаблоне редактора - PullRequest
0 голосов
/ 03 июля 2019

Мне нужен редактор TimeSpan с отдельными полями для дней, часов, минут и секунд. У меня есть пользовательский редактор tempalte, связыватель моделей, поставщик связывателей моделей и зарегистрирован последний.

При отображении страницы возникает исключение NullReferenceException.

System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта. в Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ExpressionMetadataProvider. <> c__DisplayClass0_0 2.<FromLambdaExpression>g__modelAccessor|0(Object container) at Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExplorer.get_Model() at Kendo.Mvc.UI.Fluent.WidgetFactory 1.NumericTextBoxFor [TValue] (выражение 1 expression) at Kendo.Mvc.UI.Fluent.WidgetFactory 1.IntegerTextBoxFor (выражение 1 expression) at AspNetCore.Views_Shared_EditorTemplates_TimeSpanNumeric.ExecuteAsync() in E:\Source\MCT\MCT\Views\Shared\EditorTemplates\TimeSpanNumeric.cshtml:line 5 at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageCoreAsync(IRazorPage page, ViewContext context) at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageAsync(IRazorPage page, ViewContext context, Boolean invokeViewStarts) at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderAsync(ViewContext context) at Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.TemplateRenderer.Render() at Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.TemplateBuilder.Build() at Microsoft.AspNetCore.Mvc.ViewFeatures.HtmlHelper.GenerateEditor(ModelExplorer modelExplorer, String htmlFieldName, String templateName, Object additionalViewData) at Microsoft.AspNetCore.Mvc.ViewFeatures.HtmlHelper.Editor(String expression, String templateName, String htmlFieldName, Object additionalViewData) at Microsoft.AspNetCore.Mvc.Rendering.HtmlHelperEditorExtensions.Editor(IHtmlHelper htmlHelper, String expression, String templateName, Object additionalViewData) at Kendo.Mvc.UI.GridBoundColumn 2. кодер HelderHerderterHeder_Heder_HerderHerderHerderHerderHerder) в Kendo.Mvc.UI.Grid 1.<>c__DisplayClass69_1.<InitializeEditors>b__2(IGridBoundColumn column) at Kendo.Mvc.Extensions.EnumerableExtensions.Each[T](IEnumerable 1 экземпляр, действие 1 action) at Kendo.Mvc.UI.Grid 1.ProcessSettings () в Kendo.Mvc.UI.WidgetBase.RenderHtml (писатель TextWriter) в Kendo.Mvc.UI.WidgetBase.ToHtmlString () в Kendo.Mvc.UI.Fluent.WidgetBuilderBase 2.WriteTo(TextWriter writer, HtmlEncoder encoder) at Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ViewBuffer.WriteToAsync(TextWriter writer, HtmlEncoder encoder) at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderLayoutAsync(ViewContext context, ViewBufferTextWriter bodyWriter) at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderAsync(ViewContext context) at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ViewContext viewContext, String contentType, Nullable 1 statusCode) в Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync (ActionContext actionContext, представление IView, ViewDataDictionary viewData, ITempDataDictionary tempData, String contentType, Nullable`1 statusCode) в Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor.ExecuteAsync (контекст ActionContext, результат ViewResult) в Microsoft.AspNetCore.Mvc.ViewResult.ExecuteResultAsync (контекст ActionContext) в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeResultAsync (результат IActionResult) в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResultFilterAsyncTFilter, TFilterAsync в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow (контекст ResultExecutedContext) в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.ResultNext [TFilter, TFilterAsync] (Состояние и следующее, Область и область действия, Объект и состояние, Логическое значение и isCompleted) в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeResultFilters () в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter () в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow (контекст ResourceExecutedContext) в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next (State & next, Scope & scope, Object & state, Boolean & isCompleted) в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync () в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync () в Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke (HttpContext httpContext) в Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke (HttpContext httpContext) в Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke (контекст HttpContext) в Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke (контекст HttpContext)

Шаблон редактора:

@model TimeSpan    
@{
    if (Model != null) {
        @Html.Kendo().IntegerTextBoxFor(model => model.Days).HtmlAttributes(new { style = "width: 30px;" }).Spinners(false)@:.
        @Html.Kendo().IntegerTextBoxFor(model => model.Hours).HtmlAttributes(new { style = "width: 30px;" }).Spinners(false).Max(23)@: :
        @Html.Kendo().IntegerTextBoxFor(model => model.Minutes).HtmlAttributes(new { style = "width: 30px;" }).Spinners(false).Max(59)@: :
        @Html.Kendo().IntegerTextBoxFor(model => model.Seconds).HtmlAttributes(new { style = "width: 30px;" }).Spinners(false).Max(59)
    }
}

Сетка Kendo UI, отображающая шаблон редактора:

@(
        Html.Kendo().Grid<MctDataViewModel>().Name("grid")
        .ToolBar(toolbar => toolbar.Create())
        .Pageable()
        .Scrollable()
        .Editable(e => e.Enabled(true).Mode(GridEditMode.InLine))
        .Columns(c => { c.Command(cmd => { cmd.Edit().Text(" "); cmd.Destroy().Text(" "); }) ;
            c.Bound(m => m.Id);
            c.Bound(m => m.SequenceNumber);
            c.Bound(m => m.SequenceName);
            c.Bound(m => m.StepNumber);
            c.Bound(m => m.StepName);
            c.Bound(m => m.ParallelNumber);
            c.ForeignKey(m => m.RowType, (System.Collections.IEnumerable)ViewData[nameof(MCTRowType)], "Key", "Value");
            c.ForeignKey(m => m.TimeType, (System.Collections.IEnumerable)ViewData[nameof(MCTTimeType)], "Key", "Value");
            c.Bound(m => m.TimeNeeded).EditorTemplateName("TimeSpanNumeric");
            c.ForeignKey(m => m.InventoryType, (System.Collections.IEnumerable)ViewData[nameof(MCTInventoryType)], "Key", "Value").EditorTemplateName("GridNullableForeignKey");
            c.Bound(m => m.ByInventoriesUnits);
            c.Bound(m => m.ByInventoriesUnitsPerDay);
        })
        .DataSource(ds => ds.Ajax()
            .Sort(s => { s.Add(m => m.SequenceNumber); s.Add(m => m.StepNumber); })
            .Create(c => c.Action(nameof(MCT.Controllers.HomeController.CreateGridDate), "Home"))
            .Read(r => r.Action(nameof(MCT.Controllers.HomeController.ReadGridData), "Home"))
            .Update(u => u.Action(nameof(MCT.Controllers.HomeController.UpdateGridDate), "Home"))
            .Destroy(d => d.Action(nameof(MCT.Controllers.HomeController.DeleteGridDate), "Home"))
            .Model(m => {
                m.Id(mct => mct.Id);
                m.Field(f => f.TimeNeeded).DefaultValue(TimeSpan.Zero); })
        )
)

Сервисная конфигурация:

public void ConfigureServices(IServiceCollection services) {
    // Add framework services.
    services
        .AddMvc(options => {
            options.ModelBinderProviders.Insert(0, new TimeSpanModelBinderProvider());
        })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
        // Maintain property names during serialization. See:
        // https://github.com/aspnet/Announcements/issues/194
        .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());

    // Add Kendo UI services to the services container
    services.AddKendo();
}

Даже указание платформе явно использовать связыватель модели в модели представления не меняет проблему.

    [Microsoft.AspNetCore.Mvc.ModelBinder(typeof(TimeSpanModelBinder))]
    public TimeSpan TimeNeeded { get; set; }

Модель связующего никогда не называется. Modelbinderprovider вызывается из другого запроса на странице, используемой для перехода на эту страницу. Так что регистрация провайдера вроде бы работает.

Чего мне не хватает? Как получить ядро ​​asp.net для рендеринга моего пользовательского редактора?

С уважением, Бернд

...