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

时间:2014-06-21 11:54:38

标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

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

首先,我创建了两个项目视图

Front 项目是一个包含控制器和模型的Web应用程序

视图项目是一个只包含视图的类库项目

我的问题是如何在视图项目

中创建控制器调用视图

我有像这样的控制器:

public ActionResult Default()
        {
            return this.View();
        }

3 个答案:

答案 0 :(得分:53)

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

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});

包括查看您创建自定义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());

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

这里有一些好文章:

Storing ASP.NET MVC Controllers & Views in separate assemblies

ASP.NET MVC: Putting Your Controllers In A Separate Assembly

How to call controllers in external assemblies in an ASP.NET MVC application

答案 1 :(得分:30)

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

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

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

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

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

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

答案 2 :(得分:4)

您可以预编译您的视图 - 这样它们就会包含在dll中,您可以从其他项目中引用它们。

怎么做:

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

    虽然您需要对模型进行一些操作,但要么将它们与视图放在一起,要么为它们设置第三个项目 - 否则您将具有循环依赖性。

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

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