是否可以访问位于另一个项目中的MVC视图?

Meh*_*egi 25 asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我想将我的MVC项目分成几个项目

首先,我创建了两个项目FrontViews

阵线项目是一个Web应用程序,其中包含控制器和模型

项目是一个类库项目,将只包含的意见

我的问题是如何在Views项目中创建控制器调用视图

我有像这样的控制器:

public ActionResult Default()
        {
            return this.View();
        }
Run Code Online (Sandbox Code Playgroud)

Moh*_*our 55

对于包含控制器,您需要更改路由注册以告知它们在哪里查找控制器:

routes.MapRoute(name: "Default", url: "{controller}/{action}/{id}",
                namespaces: new[] {"[Namespace of the Project that contains your controllers]"},
                defaults: new {controller = "Home", action = "Index", id = UrlParameter.Optional});
Run Code Online (Sandbox Code Playgroud)

包括查看您创建自定义ViewEngine:

public class CustomViewEngine: RazorViewEngine
{
    public CustomViewEngine()
    {
        MasterLocationFormats = new string[]
        {
            "~/bin/Views/{1}/{0}.cshtml",
            "~/bin/Views/{1}/{0}.vbhtml",
            "~/bin/Views/Shared/{0}.cshtml",
            "~/bin/Views/Shared/{0}.vbhtml"

        };
        ViewLocationFormats = new string[]
        {
             "~/bin/Areas/{2}/Views/{1}/{0}.cshtml",
             "~/bin/Areas/{2}/Views/{1}/{0}.vbhtml",
             "~/bin/Areas/{2}/Views/Shared/{0}.cshtml",
             "~/bin/Areas/{2}/Views/Shared/{0}.vbhtml"
        };
        .
        .
        .
    }
}
protected void Application_Start()
{
    ViewEngines.Engines.Add(new CustomViewEngine());
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看RazorViewEngin的默认实现.

这里有一些好文章:

将ASP.NET MVC控制器和视图存储在单独的程序集中

ASP.NET MVC:将控制器放在单独的程序集中

如何在ASP.NET MVC应用程序中调用外部程序集中的控制器


Eri*_*sch 32

MVC不会将视图编译到DLL中,而是将它们作为文件从站点目录的根目录引用.按照惯例,位置为〜/ Views,并遵循搜索路径.这或多或少硬编码到默认视图引擎中.

因为视图是文件,所以当您将它们分成单独的项目时,它们将不存在于您的主Web应用程序项目中.因此,视图引擎无法找到它们.编译应用程序时,引用的任何项目都只会复制DLL(以及其他一些东西,比如pdb等)

现在,有办法解决这个问题,但说实话,他们通常比他们的价值更麻烦.您可以在mvc contrib项目中查看"可移植区域",但这些并没有得到很好的支持,并且一直在谈论用NuGet包装替换它们.

您也可以按照@ mo.esmp的建议,创建一个自定义视图引擎,但是您仍然需要找到在构建和/或部署时站点可以访问它们的地方复制视图的方法.

我的建议是不要以你描述的方式打破项目.我认为没有任何价值.如果您的项目变得如此之大,我会将您的代码分成几个区域,并将所有区域代码和数据保存在一起.

将明显相互依赖的项目分成单独的程序集是有什么价值的,它们的唯一目的是根据目的收集事物?我认为将模型分离到自己的项目中有一些价值,因为模型可以被多个程序集使用.但是,控制器和视图仅由MVC主站点使用.

  • 分离控制器,视图和客户端脚本的一个原因可能是在其他项目中重用它们.例如,我有两个不相关的项目,都需要管理用户管理. (23认同)
  • 一个原因是拥有特定于一个客户的控制器和视图,因此您可以保持网站的通用性 (2认同)

sol*_*olo 5

您可以预编译视图-这样,它们便会包含在dll中,并且您可以从另一个项目中引用它们。

怎么做:

  1. 将视图移到另一个项目
  2. 在Visual Studio中安装Razor Generator扩展
  3. 将这些视图的“自定义工具”更改为RazorGenerator
  4. 将RazorGenerator.Mvc NuGet包添加到视图项目
  5. 主项目中的参考视图项目

而已!

尽管您需要对模型做一些事情,要么将它们与视图放在一起,要么为它们创建第三个项目-否则您将具有循环依赖关系。

另一个缺点是,将要使用视图的每个人都需要该Razor Generator扩展。

基本上,这种工作方式是使Visual Studio在设计时从视图生成.cs文件,这些文件是已编译dll的一部分,与任何其他代码相同。

  • 找到了!它位于cshtml文件的属性中。 (3认同)