Как использовать 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}})