当前位置:  开发笔记 > 编程语言 > 正文

ASP.NET MVC 6:在单独的程序集中查看组件

如何解决《ASP.NETMVC6:在单独的程序集中查看组件》经验,为你挑选了1个好方法。

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

BookStore.Components (容纳常见视图组件)

BookStore.Web1 (引用BookStore.Components)

BookStore.Web2 (引用BookStore.Components)

我创建了一个新的类库(Package)并在其中创建了一个视图组件.我还在嵌套文件夹约定之后创建了视图.我的BookStore.Components项目看起来像这样:

在此输入图像描述

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

@Component.Invoke("BookOfTheMonth")

...我的内容正文出现了500错误.似乎发现了ViewComponent类,但组件的剃刀视图却没有.

我还尝试扩展,DefaultViewComponentDescriptorProvider以便BookStore.Components可以发现程序集中的视图组件:

定义了AssemblyProvider

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

使用Autofac注册的AssemblyProvider

builder.RegisterType()
    .AsImplementedInterfaces();

builder.RegisterType()
    .AsImplementedInterfaces();

我不确定是否DefaultViewComponentDescriptorProvider需要上面的注册,所以我尝试使用和不使用它,但我仍然在调用视图组件的页面上得到500错误.

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



1> Johnny Oshik..:

更新2017-03-09

使用MS Build在Visual Studio 2017中发生了一些变化.幸运的是,它更简单.以下是如何使其工作:

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


   

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

然后在Startup中,将外部程序集添加到文件提供程序列表中:

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

我现在暂时留下原来的答案,以防人们仍然试图让它与旧版本的.Net Core和project.json.

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

以下是使这项工作的步骤.

确保组件程序集中的视图结构与Web项目相同.请注意,我在问题中发布的屏幕截图中存在错误.

注册CompositeFileProviderStartup.csWeb项目的:

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

这两个CompositeFileProviderEmbeddedFileProvider是新的,所以你需要从得到这些aspnetvnext的NuGet饲料.我通过添加此源来完成此操作:

在此输入图像描述

添加依赖项project.json:

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

最后,这增加了project.json该的Components组件:

"resource": "Views/**"

这应该足以让这个工作.

这是一个有效的演示:https: //github.com/johnnyoshika/mvc6-view-components/tree/master

这个答案来自这里的讨论:https://github.com/aspnet/Mvc/issues/3750

更新2016-01-15 目前外部视图组件存在一个令人痛苦的问题.您对视图cshtml文件所做的任何更改都不会自动重新编译.即使强制Visual Studio清理和重建也不行.您需要更改组件程序集中的.cs文件以触发视图重新编译,但看起来这将是将来要更正的内容.这里解释了这个问题的原因:https://github.com/aspnet/Mvc/issues/3750#issuecomment-171765303

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有