【问题标题】:ASP.NET MVC Core 2. How avoid a component use the same model as the parent view?ASP.NET MVC Core 2. 如何避免组件使用与父视图相同的模型?
【发布时间】:2018-04-07 01:36:29
【问题描述】:

我正在创建一个从主视图调用的视图组件(过滤器组件)。

主视图需要一个列表作为模型

@model IEnumerable<Filters>

在它的头部,它调用过滤器 ViewComponent

<vc:my-filter/>

Default.cshtml 组件视图需要 Filter

@model Filters

但是,当过滤器为null 时,组件模型从父视图接收相同的模型。并且类型不兼容;

InvalidOperationException:传递到 ViewDataDictionary 的模型项的类型为“Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[Item]”,但此 ViewDataDictionary 实例需要一个“过滤器”类型的模型项。

我宁愿不将空的new Filter() 传递给 ViewComponent 视图模型,因为该组件已经实现了一些空验证。

我想不向视图组件发送任何模型。我该怎么做?我只是不想让它访问主页视图模型。

【问题讨论】:

    标签: asp.net-mvc asp.net-core-mvc asp.net-core-2.0 asp.net-core-viewcomponent


    【解决方案1】:

    这是 .NET Core v1.1 而非 v2.0 中的一项重大更改,该行为已在 here 进行了讨论。

    ViewComponent 初始 ViewDataDictionary 取自调用视图。换句话说,它要么与 View ViewDataDictionary 相同,要么是它的克隆。将主视图错误信息等传递给 ViewComponent 是有意义的。

    现在,如果 ViewComponent 将非空模型传递给视图,非空模型将附加到其 ViewDataDictionary,从而导致重新计算所有模型元数据以匹配新模型,因此在这种情况下一切正常。

    但是,如果模型为 null,则 ViewComponent ViewDataDictionary 保持不变,并用于创建其 View ViedDataDictionary。这反过来意味着 ViewComponent 视图接收到一个从调用 ViewComponent 的视图克隆的 ViewDataDictionary。

    https://github.com/aspnet/Announcements/issues/221 跟踪问题。

    此外,您可以使用this answer 中提到的解决方法。

    【讨论】:

      猜你喜欢
      • 2021-03-15
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多