web-dev-qa-db-ja.com

asp.netコアのHtml.PartialでViewDataDictionaryを使用する方法

私のケースは次のようになります:

モデル:

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に送信し、ViewDataDictionaryBookIdを含めます。

私の質問:どうすればよいですか?

17
Tân

これを使用する別の方法は、現在のビューのViewDataをコンストラクターに渡すことです。これにより、新しいViewDataDictionaryが、コレクション初期化子を使用して配置したアイテムで拡張されます。

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

次のコードを使用して、ViewDataDictionaryを作成します。

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

.NET Coreでは、次のようなパラメーターを指定してViewDataDictionaryを使用します。

@ Html.Partial( "YourPartial"、new ViewDataDictionary(ViewData){{"BookId"、Model.Id}})

3
user3645907