我遇到了同样的错误,我的团队中的某人更新了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