私のケースは次のようになります:
モデル:
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
を選択してF12
を押すと、次のような結果になります。
namespace Microsoft.AspNetCore.Mvc.ViewFeatures
{
public ViewDataDictionary(IModelMetadataProvider metadataProvider, ModelStateDictionary modelState);
}
IModelMetadataProvider
およびModelStateDictionary
とは何ですか?
私の目標:モデルcomments
をビューDetail.cshtml
から部分ビュー_Comment.cshtml
に送信し、ViewDataDictionary
にBookId
を含めます。
私の質問:どうすればよいですか?
これを使用する別の方法は、現在のビューのViewData
をコンストラクターに渡すことです。これにより、新しいViewDataDictionary
が、コレクション初期化子を使用して配置したアイテムで拡張されます。
@Html.Partial("MyPartial", new ViewDataDictionary(ViewData) { { "BookId", Model.Id } })
次のコードを使用して、ViewDataDictionaryを作成します。
new ViewDataDictionary(new Microsoft.AspNetCore.Mvc.ModelBinding.EmptyModelMetadataProvider(), new Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary()) { { "BookId", Model.Id } }
.NET Coreでは、次のようなパラメーターを指定してViewDataDictionaryを使用します。
@ Html.Partial( "YourPartial"、new ViewDataDictionary(ViewData){{"BookId"、Model.Id}})