传递给ViewDataDictionary的模型项的类型为'System.ValueTuple`2

时间:2019-07-04 15:03:54

标签: c# asp.net-core tuples asp.net-core-2.1

我已经在_ShowComments.cshtml视图中将模型定义为元组类型,但是当我要调用此Partialview时

当我在Default.cshtml中调用该方法时,出现此错误。

我该如何解决?

错误消息:

  

InvalidOperationException:模型项传递到   ViewDataDictionary是类型   'System.ValueTuple`2 [System.Collections.Generic.List`1 [Jahan.Beta.Web.App.Models.Comment],System.Nullable`1 [System.Int32]],   但是此ViewDataDictionary实例需要一个类型为   “ System.ValueTuple`2 [System.Collections.Generic.IList`1 [Jahan.Beta.Web.App.Models.Comment],System.Nullable`1 [System.Int32]]”。

Default.cshtml:

@model List<Comment>

<div class="media mb-4">
    <div class="media-body">
        @Html.Partial("_ShowComments", ValueTuple.Create<List<Comment>, int?>(Model,null))
    </div>
</div>

_ShowComments.cshtml:

@model (IList<Comment> comments, int? parentId)

@if (Model.comments.Any(c => c.ParentId == Model.parentId))
{
    <ul class="list-unstyled">
        @foreach (var childComment in Model.comments.Where(c => c.ParentId == Model.parentId))
        {
            <li class="media">
                @Html.Partial("_ShowComments", (Model.comments, childComment.Id))
            </li>
        }
    </ul>
}

1 个答案:

答案 0 :(得分:3)

当视图期望ValueTuple<List<Comment>, int?>(请注意ValueTuple<IList<Comment>, int?>List)并且编译器将它们视为不同类型时,您正在创建IList。使用正确的元组类型:

@Html.Partial("_ShowComments", ValueTuple.Create<IList<Comment>, int?>(Model,null))

或者我认为更简洁的语法:

@Html.Partial("_ShowComments", ((IList<Comment>)Model,null))

或者,作为我的首选解决方案,创建一个合适的类来保存值:

public class ShowCommentsModel
{
    public IList<Comment> Comments { get; set; }
    public int? ParentId { get; set; }
}

并切换视图以使用:

@model ShowCommentsModel