gpt4 book ai didi

c# - ASP.NET MVC 6 : view components in a separate assembly

转载 作者:IT王子 更新时间:2023-10-29 04:43:39 26 4
gpt4 key购买 nike

我想在 MVC 6 Web 启动项目的单独程序集中定义 View 组件(这是 ASP.NET MVC 6 中的新组件),以便我可以在多个 Web 项目中重用它们。示例解决方案可能如下所示:

  • BookStore.Components (包含通用 View 组件)
  • BookStore.Web1 (引用 BookStore.Components)
  • BookStore.Web2 (引用 BookStore.Components)

我新建了一个类库(Package),在里面新建了一个 View 组件。我还按照嵌套文件夹约定创建了 View 。我的 BookStore.Components 项目如下所示:

enter image description here

当我尝试从我的 Web 项目调用此 View 组件时:

@Component.Invoke("BookOfTheMonth")

...我收到内容正文为空的 500 错误。似乎发现了 ViewComponent 类,但未发现该组件的 Razor View 。

我还尝试扩展 DefaultViewComponentDescriptorProvider 以便可以发现来自 BookStore.Components 程序集的 View 组件:

定义了一个AssemblyProvider

 public class AssemblyProvider : IAssemblyProvider
{
public IEnumerable<Assembly> CandidateAssemblies
{
get
{
yield return typeof(AssemblyProvider).Assembly;
yield return typeof(BookStore.Components.BookOfTheMonthViewComponent).Assembly;
}
}
}

使用Autofac注册AssemblyProvider

builder.RegisterType<AssemblyProvider>()
.AsImplementedInterfaces();

builder.RegisterType<DefaultViewComponentDescriptorProvider>()
.AsImplementedInterfaces();

我不确定是否需要注册上面的DefaultViewComponentDescriptorProvider,所以我尝试了有没有它,但是在调用 View 组件的页面上仍然出现500错误.

如何从 MVC6 Web 项目中调用位于单独程序集中的 View 组件?

最佳答案

更新 2017-03-09

在使用 MS Build 的 Visual Studio 2017 中,情况发生了一些变化。幸运的是,它要简单得多。以下是如何让它工作:

在外部程序集中,将其添加到 csproj 文件中:

<ItemGroup>
<EmbeddedResource Include="Views/**/*.cshtml" />
</ItemGroup>

在主 Web 项目中,添加此 NuGet 包:Microsoft.Extensions.FileProviders.Embedded

然后在 Startup 中,将外部程序集添加到 File Providers 列表中:

    services.Configure<RazorViewEngineOptions>(options =>
{
options.FileProviders.Add(new EmbeddedFileProvider(
typeof(SampleClassInAssembly).Assembly
# Prior to .Net Standard 2.0
# typeof(SampleClassInAssembly).GetTypeInfo().Assembly
));
});

我暂时将原始答案留在下面,以防人们仍在尝试让它与旧版本的 .Net Core 和 project.json 一起使用。

============================================= =================

以下是完成这项工作的步骤。

  • 确保组件装配中的 View 结构与您的网络项目相同。请注意,我随问题一起发布的屏幕截图有误。
  • 在web项目的Startup.cs中注册CompositeFileProvider:

    services.Configure<RazorViewEngineOptions>(options =>
    {
    options.FileProvider = new CompositeFileProvider(
    new EmbeddedFileProvider(
    typeof(BookOfTheMonthViewComponent).GetTypeInfo().Assembly,
    "BookStore.Components"
    ),
    options.FileProvider
    );
    });

CompositeFileProviderEmbeddedFileProvider 都是新的,因此您需要从 aspnetvnext NuGet 提要中获取它们。我通过添加此源来做到这一点:

enter image description here

project.json中添加依赖:

"Microsoft.AspNet.FileProviders.Composite": "1.0.0-*",
"Microsoft.AspNet.FileProviders.Embedded": "1.0.0-*",

最后,将其添加到 Components 程序集的 project.json 中:

"resource": "Views/**"

这应该足以让它工作。

这是一个工作演示: https://github.com/johnnyoshika/mvc6-view-components/tree/master

这个答案是从这里的讨论中得出的:https://github.com/aspnet/Mvc/issues/3750

更新 2016-01-15目前外部 View 组件存在一个痛苦的问题。您对 View cshtml 文件所做的任何更改都不会自动重新编译。即使是强制 Visual Studio 清理和重建也无法做到这一点。您需要更改组件程序集中的 .cs 文件才能触发 View 重新编译,但看起来这将在未来得到纠正。此处解释了此问题的原因:https://github.com/aspnet/Mvc/issues/3750#issuecomment-171765303

关于c# - ASP.NET MVC 6 : view components in a separate assembly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34236850/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com