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

Asp.net 是否可以访问位于另一个项目中的MVC视图?,asp.net,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,我想把我的MVC项目分成几个项目 首先,我创建了两个项目Front和Views Front项目是一个包含控制器和模型的web应用程序 视图项目是仅包含视图的类库项目 我的问题是如何使控制器调用位于视图项目中的视图 我有这样的控制器: public ActionResult Default() { return this.View(); } 对于包含控制器,您需要更改路线注册,以告诉他们在何处查找控制器: routes.MapRoute(n

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

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

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

视图项目是仅包含视图的类库项目

我的问题是如何使控制器调用位于视图项目中的视图

我有这样的控制器:

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

对于包含控制器,您需要更改路线注册,以告诉他们在何处查找控制器:

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
的默认实现

这里有一些好文章:


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

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

现在,有一些方法可以解决这个问题,但老实说,它们通常比它们的价值更麻烦。您可以查看mvc contrib项目中的“可移植区域”,但这些区域没有得到很好的支持,而且有人说要用NuGet打包来替换它们

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

我的建议是不要以你描述的方式开展项目。我看不出有什么价值。如果您的项目变得如此庞大,我会将您的代码分成多个区域,并将所有区域代码和数据放在一起


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

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

如何做到:

  • 将视图移动到另一个项目
  • 在Visual Studio中安装Razor生成器扩展
  • 将这些工具的自定义工具更改为RazorGenerator 观点
  • 将RazorGenerator.Mvc NuGet包添加到视图项目
  • 从主项目中引用视图项目
  • 就这样

    尽管您需要对您的模型做一些事情,但是您可以将它们与视图放在一起,或者为它们创建第三个项目,否则您将有一个循环依赖关系

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



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

    如何将MVC分解为MC&V作为项目并使用MVC。我不会建议你这么做。我曾经在一些公司工作,他们有一个mvc项目,分为数千个项目、控制器项目、模型项目、视图项目、资源项目(包含样式和外观)和服务项目。即使是视图项目,如果我有很好的内存,也会根据用户代理和使用的设备分为很多项目。@超级冷却如果遵循某种架构或设计模式,也可以这样做。但是让事情变得复杂起来看起来像是VS2017,MVC6支持这一点,这是一个很好的见解,我完全同意你的看法
    erik
    <代码>我会将您的代码划分为多个区域说得好,我更喜欢相同的方法,即为业务逻辑创建一个单独的层,并将服务方法调用到控制器。Cheers分离控制器、视图和客户端脚本的一个原因可能是在其他项目中重用它们。例如,我有两个其他方面不相关的项目,都需要管理用户管理。这样做的一个很好的原因是使用单页应用程序,该应用程序将由MVC提供服务,并在其他地方(如移动设备)使用。一个原因是拥有特定于一个客户的控制器和视图,所以你可以保留网站的所有内容generic@user2326106-我觉得你说的和我们说的不一样。事实上,我不知道你在说什么。不是自己创建这个,而是有内置的功能。我们需要外部组件作为MVC项目吗?如果是类库,我需要包含哪些引用DLL?@Mohsen Esmailpour我们应该如何在ViewLocationFormats中引用特定的项目名称?例如,它是否类似于“Library2\Views\Accounts\List.cshtml”?链接被断开@YahyaHusseinOh添加的新链接。。。美好的我想我要试试这个。你能再解释一下第三步吗?发生在哪里?找到了!它在cshtml文件的属性中。听起来很有希望,但我只能找到带有Nuget GUI的RazorEngine.Generator,这不一样,当我尝试从它安装时,它说它找不到可安装的兼容产品,即使页面上说它支持VS 2013,这就是我正在使用的:(您提到您试图在NuGets中查找扩展-这有点不同。您能否尝试在Vi中的“工具”>“扩展和更新”中查找菜单项