Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 具有视图模型问题的多租户MVC 3应用程序_Asp.net Mvc_Asp.net Mvc 3_Multi Tenant - Fatal编程技术网

Asp.net mvc 具有视图模型问题的多租户MVC 3应用程序

Asp.net mvc 具有视图模型问题的多租户MVC 3应用程序,asp.net-mvc,asp.net-mvc-3,multi-tenant,Asp.net Mvc,Asp.net Mvc 3,Multi Tenant,我正在编写一个应用程序,它利用多租户,如所述 在Zack的例子中,他有单独的c#类库来存储每个租户的控制器和视图。因为我没有使用已编译视图的Spark View引擎,所以这不是一个选项。相反,我为每个租户创建了一个单独的MVC3应用程序项目,并在其中存储内容、控制器、视图等 我有一个主MVC应用程序项目(它是启动应用程序),带有一个自定义控制器工厂,它扫描程序集,类似于Zacks示例,并使用结构映射设置依赖项注入。我有一个视图引擎,它使用控制器上下文来获取正确的视图。如果在租户应用程序中找不到视

我正在编写一个应用程序,它利用多租户,如所述

在Zack的例子中,他有单独的c#类库来存储每个租户的控制器和视图。因为我没有使用已编译视图的Spark View引擎,所以这不是一个选项。相反,我为每个租户创建了一个单独的MVC3应用程序项目,并在其中存储内容、控制器、视图等

我有一个主MVC应用程序项目(它是启动应用程序),带有一个自定义控制器工厂,它扫描程序集,类似于Zacks示例,并使用结构映射设置依赖项注入。我有一个视图引擎,它使用控制器上下文来获取正确的视图。如果在租户应用程序中找不到视图或依赖项,它将使用主MVC应用程序项目中的视图或依赖项。除了viewmodels之外,一切都非常好

我们的大多数视图(如果不是全部的话)都传递了一个视图模型。我希望视图模型类驻留在租户应用程序项目中,而不是主应用程序项目中,这样租户就可以拥有自定义视图模型来支持其自定义视图

这似乎是可行的,但我总是出错

场景1默认视图模型位于主MVC应用程序项目中。租户应用程序引用了主应用程序,因此可以使用默认视图模型。没问题。现在,当我想添加视图模型或覆盖视图模型时,我会创建该类并将其放在租户应用程序中。问题是,当您调用该页面时,主MVC应用程序找不到新的视图模型,因为主应用程序没有对租户应用程序的引用,并且由于循环引用问题,无法找到新的视图模型

场景#2-我删除租户应用程序到主应用程序的引用。然后,我将默认视图模型从主应用程序复制到租户应用程序,更改名称空间,并创建从主应用程序到租户应用程序的引用,以便主应用程序可以访问视图模型类

然后我运行它并得到以下错误:

传入字典的模型项的类型为“Sample.Models.Login”,但此字典需要“Sample.Models.Login”类型的模型项。

这个错误是有道理的,但不是真的。我只有一个名为Sample.Models.Login的类

我对为什么会这样做有一些假设,但我无法弄清楚。如有任何提示或建议,将不胜感激


谢谢你

我不确定我是否理解,但我还是要试一试

首先,如果需要不同的视图模型,那么很可能需要不同的控制器/操作。也许您只是想添加一些额外的信息——在这种情况下,自定义视图模型应该基于原始视图模型。通过将主视图模型移动到单独的部件中,可以解决循环参照问题。您还可以通过使用插件框架(如托管扩展性框架)来管理引用问题

然而,对于任何给定的控制器/操作,视图主要部分的数据需求应该是相当恒定的,而不管租户是谁。如果它需要不同的数据,它可能做的事情并不完全相同,应该采取不同的行动

也就是说,例如,一个租户可以在每个页面的顶部有一个迷你篮,而其他租户没有,因此您可能认为他们需要自定义视图模型来包含篮数据。但是,更好的方法是修改租户的母版页,例如(在Razor中)包含对@Html.RenderAction(“minibark”)的调用,该操作将负责获取额外的篮子数据


另外,如果您想像Adam建议的那样编译视图,另一个选择是查看。

FYI您可以编译视图。右键单击项目以卸载它,然后右键单击以编辑它,然后将第一个组(MvcBuildViews)中的最后一项设置为true而不是false。保存并重新加载项目并编译。