Как использовать ViewDataDictionary с Html.Partial в ядре asp.net?

Мое дело выглядит так:

Модель:

public class Book
{
    public string Id { get; set; }

    public string Name { get; set; }
}

public class Comment
{
    public string Id { get; set; }

    public string BookId { get; set; }

    public string Content { get; set; }    
}

контроллер:

public IActionResult Detail(string id)
{
    ViewData["DbContext"] = _context; // DbContext

    var model = ... // book model

    return View(model);
}

Посмотреть:

Детальный вид:

@if (Model?.Count > 0)
{
    var context = (ApplicationDbContext)ViewData["DbContext"];
    IEnumerable<Comment> comments = context.Comments.Where(x => x.BookId == Model.Id);

    @Html.Partial("_Comment", comments)
}

Комментарий частичного просмотра:

@model IEnumerable<Comment>

@if (Model?.Count > 0)
{
    <!-- display comments here... -->
}

<-- How to get "BookId" here if Model is null? -->

Я пробовал это:

@Html.Partial("_Comment", comments, new ViewDataDictionary { { "BookId", Model.Id } })

затем

@{
    string bookid = ViewData["BookId"]?.ToString() ?? "";
}

@if (Model?.Count() > 0)
{
    <!-- display comments here... -->
}

<div id="@bookid">
    other implements...
</div>

Но ошибка:

'ViewDataDictionary' не содержит конструктор, который принимает 0 аргументов

Когда я выбираю ViewDataDictionary и ViewDataDictionary F12, он обращается к:

namespace Microsoft.AspNetCore.Mvc.ViewFeatures
{
    public ViewDataDictionary(IModelMetadataProvider metadataProvider, ModelStateDictionary modelState);
}

Я не знаю, что такое IModelMetadataProvider и ModelStateDictionary?

Моя цель: Отправить comments модели из view Detail.cshtml к частичному представлению _Comment.cshtml с ViewDataDictionary который содержит BookId.

Мой вопрос: как я могу это сделать?

Ответ 1

Другой способ использовать это - передать ViewData текущего представления в конструктор. Таким образом, новый ViewDataDictionary будет расширен с помощью элементов, которые вы вставляете, используя инициализатор коллекции.

@Html.Partial("MyPartial", new ViewDataDictionary(ViewData) { { "BookId", Model.Id } })

Ответ 2

Используйте следующий код, чтобы создать ViewDataDictionary

new ViewDataDictionary(new Microsoft.AspNetCore.Mvc.ModelBinding.EmptyModelMetadataProvider(), new Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary()) { { "BookId", Model.Id } }

Ответ 3

В .NET Core я использую ViewDataDictionary с параметром, например:

@Html.Partial("YourPartial", новый ViewDataDictionary (ViewData) {{"BookId", Model.Id}})