Проблемы при объединении просмотров AspNetCore MVC на одной странице просмотра - PullRequest
0 голосов
/ 12 сентября 2018

Основная проблема, с которой я столкнулся, - это исключение пустых ссылок (подробно описано ниже) в коде формы с помощником выбора тегов.Тем не менее, мне нужен совет по общему подходу, в том числе по нескольким видам на странице.

Я рассмотрел различные способы объединения нескольких видов на одной странице. Этот использует варианты if-else для макета и RenderPartial для частичных представлений с отдельными контроллерами / действиями, а этот аналогичен зависимости от AJAX для отзывчивости на стороне клиента, которую я не знаю, еслиЯ хочу или нуждаюсь в эталонной реализации.Я также посмотрел на другие предлагаемые результаты поиска, которые не были так близки, как эти два.

Итак, я посмотрел и попробовал два следующих подхода, используя код, который я разработал для выбораи отображение результатов просмотра одной страницы для каждой из четырех категорий данных из определенной записи базы данных.Четыре категории данных должны быть добавлены вместе по очереди к общей странице сообщения, потому что эта страница предназначена для сборки всего сообщения CAP.Затем я снова буду использовать его на страницах «Просмотр сообщения» и «Утверждение сообщения», что является окончательной чертой для этого первого проекта EDXL (Emergency Data Exchange Language) (Аллилуйя!)

Вот первая попытка, используя тот же код, который использовался для выбора записи, для которой я хочу отобразить сведения о категории «Оповещение» всего сообщения.

@model edxl_cap_v1_2.Models.ContentViewModels.EdxlCapMessageViewModel
. . .
@{
<h4>Alert</h4>

<div class="select_container">
    <form asp-controller="Alerts" asp-action="Details" method="post">
        <select class="cap_select" id="cap_select" style="width:100%;max-width:95%;"
        asp-for="SelectedAlertIndex" asp-items="@Model.Alert_Identifiers">
            <option>Select one</option>
        </select>
        <br />
        <input type="submit" name="Details" value="LoadAlert" />
    </form>
</div>
}

Однако в строке появляется исключение Null Reference:1014 *.Единственное различие между этим кодом и кодом, который успешно извлекает и отображает категорию предупреждений в таблице на странице Index.cshtml, состоит в том, что эта ссылка ссылается на asp-action=”Details”, а не на Index.

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

В другом подходе, который я пробовал, используется один из этих же кодовых блоков в каждом изчетыре отдельных частичных представления на одной странице с использованием пользовательского макета для этой страницы представления «Assemble.cshtml» с использованием EdxlCapMessageViewModelsController.Само собой разумеется, у меня все еще есть то же исключение Null Reference, и я не вижу, как преодолеть это.Для этой второй версии я использую метод минимального действия в EdxlCapMessageViewModelsController:

public IActionResult Assemble()
    {
        return View();
    }

Было предложено показать код контроллера для действия Details:

// GET: Alerts/Details/5
    public async Task<IActionResult> Details(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        var alert = await _context.Alert
            //.Include(e => e.Elements)
            //    .ThenInclude(d=> d.DataCategory)
            .AsNoTracking()
            .SingleOrDefaultAsync(m => m.AlertIndex == id);

        if (alert == null)
        {
            return NotFound();
        }

        return View(alert);
    }

Но я бы тоже очень хотелСпасибо за отзывы о том, как лучше всего подойти к этой проблеме.Я добавляю EdxlCapMessageViewModel.cs

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Threading.Tasks;
using edxl_cap_v1_2.Models;
using Microsoft.AspNetCore.Mvc.Rendering;

namespace edxl_cap_v1_2.Models.ContentViewModels
{
    public class EdxlCapMessageViewModel
{
    [Key]
    public int AlertIndex { get; set; }
    public string Alert_Identifier { get; set; }
    public int SelectedAlertIndex { get; set; }
    [NotMapped]
    public List<SelectListItem> Alert_Identifiers { get; set; }
    public List<AlertVm> Alerts { get; set; }

    public Alert Alert { get; set; }

    public Info Info { get; set; }

    public Area Area { get; set; }

    public Resource Resource { get; set; }
}

}

Это трассировка стека из браузера:

NullReferenceException: Object reference not set to an instance of an object.
AspNetCore._Views_EdxlCapMessageViewModels_Assemble_cshtml+<<ExecuteAsync>b__20_1>d.MoveNext() in Assemble.cshtml
+ 19.    asp-for="SelectedAlertIndex" asp-items="Model.Alert_Identifiers">
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugger-Notification(Task task)
Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperExecutionContext+<GetChildContentAsync>d__31.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugger-Notification(Task task)
System.Runtime.CompilerServices.TaskAwaiter.GetResult()
Microsoft.AspNetCore.Mvc.TagHelpers.RenderAtEndOfFormTagHelper+<ProcessAsync>d__7.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugger-Notification(Task task)
Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperRunner+<RunAsync>d__0.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugger-Notification(Task task)
AspNetCore._Views_EdxlCapMessageViewModels_Assemble_cshtml+<ExecuteAsync>d__20.MoveNext() in Assemble.cshtml
+ 4    Layout = null;
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugger-Notification(Task task)
Microsoft.AspNetCore.Mvc.Razor.RazorView+<RenderPageCoreAsync>d__16.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugger-Notification(Task task)
Microsoft.AspNetCore.Mvc.Razor.RazorView+<RenderPageAsync>d__15.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugger-Notification(Task task)
System.Runtime.CompilerServices.TaskAwaiter.GetResult()
Microsoft.AspNetCore.Mvc.Razor.RazorView+<RenderAsync>d__14.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugger-Notification(Task task)
Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor+<ExecuteAsync>d__22.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugger-Notification(Task task)
Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor+<ExecuteAsync>d__21.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugger-Notification(Task task)
Microsoft.AspNetCore.Mvc.ViewResult+<ExecuteResultAsync>d__26.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugger-Notification(Task task)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+ 
<InvokeResultAsync>d__19.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugger-Notification(Task task)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeNextResultFilterAsync>d__24.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResultExecuted-Context context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeNextResourceFilter>d__22.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(Resource-ExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeFilterPipelineAsync>d__17.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugger-Notification(Task task)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeAsync>d__15.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugger-Notification(Task task)
Microsoft.AspNetCore.Builder.RouterMiddleware+<Invoke>d__4.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugger-Notification(Task task)
Microsoft.AspNetCore.Authentication.AuthenticationMiddleware+<Invoke>d__6.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugger-Notification(Task task)
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPoint-Middleware+<Invoke>d__4.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugger-Notification(Task task)
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPage-Middleware+<Invoke>d__6.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPage-Middleware+<Invoke>d__6.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugger-Notification(Task task)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware+<Invoke>d__7.MoveNext()

1 Ответ

0 голосов
/ 14 сентября 2018

Мне удалось решить первую проблему, изменив код на AlertPick.cshtml:

@model edxl_cap_v1_2.Models.ContentViewModels.AlertViewModel

@{
ViewData["Title"] = "AlertPick";
}

<head>
<meta name="viewport" content="width=device-width" />
<title>@ViewBag.Title</title>
</head>

@{
    <h4>@Model.Alerts.Count Alerts</h4>

    <form asp-controller="Alerts" asp-action="PickAlert" method="post">
        <select class="cap_select" id="cap_select" style="width:100%;max-width:95%;"
        asp-for="SelectedAlertIndex" asp-items="Model.Alert_Identifiers">
            <option>Select one</option>
        </select>
        <br />
        <input type="submit" name="PickAlert" value="Pick Alert to Assemble EDXL-Cap Message" />
    </form>
}

При этом отображается страница с параметрами Alert_Identifiers в раскрывающемся списке, которые можно выбрать, и которая после выбора переводит зрителя на страницу сведений для этой категории данных предупреждений, когда кнопка отправки «Выбрать предупреждение для сборки сообщения EDXL-CAP» щелкают.

Это поведение, которое я хочу, но сейчас я хочу, чтобы это поведение повторялось четыре раза на странице просмотра, которая собирает все категории данных для полного сообщения EDXL-CAP. Однако, когда я копирую AlertPick.cshtml как _AlertPick.cshtml для частичного представления и собираю набор из четырех частичных представлений в Assemble.cshtml, в противном случае пустую страницу с использованием страницы макета, которая отображает четыре частичных представления, я не получаю результат Я ищу ...

Когда я делаю это, первое частичное представление генерирует другое исключение Null Reference, сначала в строке <h4>@Model.Alerts.Count Alerts</h4>, а также в asp-for="SelectedAlertIndex" asp-items="Model.Alert_Identifiers">, когда я закомментирую эту первую строку. И он делает это, хотя AlertPick.cshtml выше идентично _AlertPick.cshtml. Таким образом, общая проблема решена только на 1/4, и это такой же ответ, как и у меня на 09-14-2018. Любая помощь будет приветствоваться, но первая часть решена, и, как сделать остальное, может потребоваться другой вопрос, если мне не удастся решить ее самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...