我遇到了在 ASP.NET Core 2.0 中使用 ViewComponent 的限制。
我们有一个从布局页面调用时绝对完美运行的 ViewComponent。当我们从 Razor 页面调用相同的 ViewComponent 时,我们会收到以下错误。
传递给 ViewDataDictionary 的模型项的类型为 但此 ViewDataDictionary 实例需要类型为 的模型项
ViewComponent 似乎期望传递父 Razor 页面的模型类型,而不是为 ViewComponent 定义的模型类型。
我没有遇到任何从 Razor 页面使用 ViewComponent 的示例,它们似乎只在布局页面(没有模型)中使用。
有人可以给我一个明确的"is"还是“否”这个问题:您可以在 Razor 页面中使用 ViewComponent,如果可以,如何使用?
最佳答案
是的,你可以,我用一个有趣的命名做了一个简单的例子。
View 组件类 - 示例 ViewView 组件 :)
namespace NetCoreUI.ViewComponents
{
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
public class SampleViewViewComponent : ViewComponent
{
public async Task<IViewComponentResult> InvokeAsync(Models.TestVm testVm)
{
testVm.TestName = "Changing name from ViewComponent.";
return View(testVm);
}
}
}
此 View 组件的默认 View :
@model NetCoreUI.Models.TestVm
<h1>This is viewcomponent.</h1>
<p>@Model.TestId</p>
<p>@Model.TestName</p>
我的 Razor 页面代码没有太多内容:
namespace NetCoreUI.Pages.Motorcycle
{
using Microsoft.AspNetCore.Mvc.RazorPages;
public class SampleModel : PageModel
{
public void OnGet()
{
}
}
}
最后是一个 Razor 页面 View ,我在其中调用了我的 ViewComponent:
@page
@model NetCoreUI.Pages.Motorcycle.SampleModel
@{
ViewData["Title"] = "Sample";
}
<h2>Sample</h2>
<div>
@await Component.InvokeAsync("SampleView", new { testVm = new Models.TestVm() })
</div>
我选择使用一个简单的 new TestVm() 类来调用我的 ViewComponent,但是这个类可以是 SampleModel 中的子集,您可以使用正确类的实例来调用您的 View Component - 正确的类是您的 ViewComponent 所引用的类。
这是一个非常简单的示例,我不确定您的应用程序是如何构建的,或者可能存在不同的问题。
关于razor - 您可以将 ViewComponents 与 Razor 页面一起使用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49919949/