InvalidOperationException 在强类型视图中呈现 ViewComponent

2024-02-29

最近更新的 dotnet core 1.0.1 到 1.1 和 MVC 中的 ViewComponent 开始失败,出现以下异常:

InvalidOperationException: One or more errors occurred. (The model item passed into the ViewDataDictionary is of type 'App.Models.HomeViewModel', but this ViewDataDictionary instance requires a model item of type 'App.Components.LoginViewComponent'.)

The 索引.cshtml渲染登录视图组件:

@model App.Models.HomeViewModel
<html>
   @Component.InvokeAsync("LoginViewComponent")
</html>

视图/Home/Index.cshtml

视图组件LoginViewComponent/Default.cshtml只是一个显示其模型信息的类:

@model App.Components.LoginViewCompoent
<body>
    <div>@Html.DisplayFor(v=>v.LoginName)</div>
</body>

视图/共享/组件/LoginViewComponent/Default.cshtml

@model指令被删除默认.cshtml.

ViewComponent 不是应该与包装它的父视图分离并且不可知吗?从例外情况来看,似乎需要声明登录视图组件视图组件在主页视图模型类以便渲染它。

在 asp.net core github 上找不到任何关于此的更改说明。

对此发表评论和帮助将不胜感激。


我遇到了同样的错误,我的团队中的某人更新了Microsoft.AspNetCore.Mvc版本从 1.0.0 到 1.1.0,我在强类型视图中拥有的一些组件开始抛出异常

InvalidOperationException:传递到 ViewDataDictionary 的模型项的类型'My.StronglyView.ObjectType',但是此 ViewDataDictionary 实例需要类型为的模型项'My.ViewComponent.ObjectType'.

我不确定这个改变是否是有意为之,但这绝对不是我们所期望的。

我没有时间研究这种“破坏性”变化的原因,但我提出了一个解决方案。

问题是,如果你将 null 对象传递给你的ViewComponent.View()方法,我们得到这个异常。任何通过它的非空对象都会更新 ViewData.ModelExplorer 和正确的对象类型会被注册,避免这种异常。

使用 Tester-Doer 模式(与 .Net Framework 的某些类中使用的模式相同),我们现在可以将非空对象传递给ViewComponent并根据需要使用它及其包装的对象。

我所做的是,我创建了一个界面IViewComponentModel<T>作为班级ViewComponentModel<T>如下:

// Interface for ViewComponentModel
public interface IViewComponentModel<T> 
    where T : class
{
    T Data { get; }
    bool HasData();
}

// ViewComponentModel class for the Strongly-Type View Component
public class ViewComponentModel<T> : IViewComponentModel<T>
    where T : class
{
    public T Data { get; private set; }

    public ViewComponentModel(T data)
    {
        Data = data;
    }

    public bool HasData() => Data != null;
}

在我的 ViewComponent 类实现中,我返回View(new ViewComponentModel<AnyReferenceType>(myModel));

public async Task<IViewComponentResult> InvokeAsync()
{
    var myViewData = _myService.GetSomeObjectForMyViewComponent();
    var model = new ViewComponentModel<MyViewDataType>(myViewData);

    return await Task.FromResult(View(model));
}

最后,在我的组件视图 (.cshtml) 中,我有以下代码:

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@model ViewComponentModel<MyViewDataType>

现在您可以在视图内对该对象执行任何您想要的操作并使用您的真实模型,只需调用@Model.Data瞧。

这样,我们永远不会将 null 对象传递给 ViewComponent,它也不会从 View '继承' 对象类型。

希望有帮助!

ASP.NET核心 /questions/tagged/asp.net-core asp.net-core-mvc /questions/tagged/asp.net-core-mvc dotnet核心 /questions/tagged/dotnet-core asp.net-core-1.1 /questions/tagged/asp.net-core-1.1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

InvalidOperationException 在强类型视图中呈现 ViewComponent 的相关文章

随机推荐

  • 一次性登录应用程序 - FirebaseAuth

    我正在开发一个使用 Firebase 身份验证通过电话号码登录用户的应用程序 我想添加一项功能 使用户只能一次性登录 即即使用户杀死应用程序并再次启动它 他也应该登录 另外 我不想添加注销功能 为此可以做什么 实现此目的的最简单方法是使用侦
  • java LocalDateTime 解析具有模式 MM/d/yyyy HH:mm:ss a 的日期的异常

    我在使用 java datetime API 执行下面的代码时遇到异常 String strDate 12 4 2018 5 26 28 PM DateTimeFormatter formatter DateTimeFormatter of
  • Spring 3 表达式语言如何与属性占位符交互?

    Spring 3 引入了新的表达语言 http docs spring io spring docs 3 0 x spring framework reference html expressions html SpEL 可以在 bean
  • 如何检测产品搜索中的拼写错误并提出可能的更正建议?

    给定一个非常大的产品名称数据库 您如何检测用户搜索中可能存在的拼写错误并建议可能的更正 有点像谷歌呈现它们的方式 E g 用户输入 fork handels 并按 搜索 他们回来了 没有结果 您是说 叉柄 吗 解决这个问题有几种方法 保留一
  • G++ 找不到 boost 库。我说他们就在众目睽睽之下

    我正在尝试构建一些代码 这是我收到的错误 main o In function static initialization and destruction 0 home jmbeck Downloads boost 1 48 0 boost
  • Visual Studio 2013 缺少转换为 Web 应用程序

    我正在管理一个旧的 Web 应用程序 它仍然具有 Framework 1 的遗留代码 你相信吗 目前使用 Framework 4 0 当我需要修复或升级网页时 我通过单击 转换为 Web 应用程序 将其转换为 Web 应用程序网页 VS 2
  • order Graphviz - 固定子图

    我喜欢创建一个像这样的 3 柱形图 Code digraph g rankdir LR node shape circle fontsize 14 fontsize 18 labeljust l rank same edge style i
  • Docker 容器超时?

    对于我在大学的论文 我正在研究一个编码排行榜系统 用户可以通过临时 Docker 容器编译 运行不受信任的代码 到目前为止 系统似乎运行良好 但我面临的一个问题是 当提交无限循环的代码时 例如 while True print infini
  • Twitter 回调 URL

    我正在使用 twitter SDK 与 ios 应用程序集成 当我遵循所有步骤并创建客户密钥并将其放入我的应用程序中时 当我运行应用程序时 它会显示 TwitterKit 确实遇到了消息错误 获取用户身份验证令牌时出错 错误域 TWTRLo
  • 如何在我自己的 C shell 中正确等待前台/后台进程?

    In this https stackoverflow com questions 873620 how do i clear this array pointer in c上一个问题我发布了大部分我自己的 shell 代码 我的下一步是实
  • 从子查询更新多列

    此类问题之前已被问过几次 但并不完全是我想要的 我需要SET两行等于子查询的不同部分 我目前正在使用 UPDATE records SET leads SELECT COUNT FROM leads table WHERE leads ta
  • 替换字符串中的字符列表

    我有一个字符串 它是网页的标题 所以它可以有 和其他特殊字符 我想编写一个函数 它将接受一个字符串并替换一个字符列表 试图找到最好的方法来做到这一点 我应该使用列表 数组或枚举来保存特殊字符列表 还是 java 中已经有一些东西可以做到这一
  • 如何使单选按钮看起来像切换按钮

    我希望一组单选按钮看起来像一组切换按钮 但功能仍然像单选按钮一样 它们不必看起来完全像切换按钮 我怎样才能只使用 CSS 和 HTML 来做到这一点 编辑 当选中 取消选中按钮时 我会满意地使小圆圈消失并更改样式 根据您想要支持的浏览器 您
  • 具有取消支持的 GetContextAsync()

    所以我正在旋转一个HttpListener等待一个OAuth2回复 在理想的情况下 当用户登录浏览器并且我们收到令牌时 该令牌只会存活几秒钟 我也希望这个有一个CancellationToken以便用户可以在延迟后停止收听 如果他们愿意 我
  • 迭代器块的测试覆盖率结果很奇怪,为什么这些语句没有执行?

    我正在使用 dotCover 来分析单元测试的代码覆盖率 并且得到一些奇怪的结果 我有一个迭代器方法 其覆盖范围不完整 但未覆盖的语句只是右大括号在该方法的末尾 这是我正在测试的方法 public static IEnumerable
  • 尝试将二进制文件部署到已存储不同二进制文件的位置

    当我从 tridio 2009 发布页面时 出现以下错误 Destination with name FTP Host servername Location RET Password Port 21 UserName retftp rep
  • 在spark中连接mongodb时出现异常

    在尝试使用 MongoDB 作为输入 RDD 时 我在 org bson BasicBSONDecoder decode 中收到 java lang IllegalStateException 未就绪 Configuration conf
  • Android:如何在 java 类中创建 EditText 字段

    我只是想知道如何通过单击按钮创建 editText 字段 是否可以 我在网上找不到任何东西 如果有人知道如何做到这一点 请回答 如果您知道如何配置尺寸 放置等也包括该信息 import android widget Button impor
  • 优化 Java 对象以提高 CPU 缓存线效率

    我正在写一个库 其中 它将需要运行在广泛的不同平台 Java 实现 常见情况可能是运行 Windows 或 Linux 的 Intel 64 位计算机上的 OpenJDK 或 Oracle Java 实现高性能是首要任务 就我关心对象访问中
  • InvalidOperationException 在强类型视图中呈现 ViewComponent

    最近更新的 dotnet core 1 0 1 到 1 1 和 MVC 中的 ViewComponent 开始失败 出现以下异常 InvalidOperationException One or more errors occurred T