asp.net mvc中的控制器重用

asp.net mvc中的控制器重用,asp.net,.net,asp.net-mvc,asp.net-mvc-4,razor,Asp.net,.net,Asp.net Mvc,Asp.net Mvc 4,Razor,我有两个不同的项目,部署时实际上是两个不同的网站,比如WebA和WebB。这两个网站的结构在控制器和使用的模型方面是相同的。然而,前端是非常不同的。他们每个人都有自己的UI和为他们工作的jquery插件 为了减少代码重复,我建议这两个项目都从另一个引用项目[ControllerDell]中的控制器继承。ControllerDell是一个项目,它拥有调用业务层和返回json序列化模型对象的所有逻辑。WebA和WebB将各自只具有空的控制器类,这些类仅继承自基础项目[ControllerDell]。

我有两个不同的项目,部署时实际上是两个不同的网站,比如WebA和WebB。这两个网站的结构在控制器和使用的模型方面是相同的。然而,前端是非常不同的。他们每个人都有自己的UI和为他们工作的jquery插件

为了减少代码重复,我建议这两个项目都从另一个引用项目[ControllerDell]中的控制器继承。ControllerDell是一个项目,它拥有调用业务层和返回json序列化模型对象的所有逻辑。WebA和WebB将各自只具有空的控制器类,这些类仅继承自基础项目[ControllerDell]。这样我觉得控制器代码没有重复

除了我提出的方法之外,还有谁能告诉我实现控制器重用的更好方法吗?asp.NETMVC4是否提供了任何内置方法来更好地实现这一点?我能有效地使用这里的区域吗?DotNetNuke是我应该看的东西吗?还是我的方法是前进的最佳途径?我不是在寻找如何将控制器移动到另一个项目中。我只想知道实现控制器重用的选项是什么

谢谢。

看看这个。您可以将所有视图保留在同一个项目中,并使用自定义视图引擎查找视图(基于web.config设置)


例如,您可以有两个文件夹/Views/WebA和/Views/WebB。自定义视图引擎可以查找web.config设置,找出要使用的文件夹,并在其中搜索视图。这样,您就不必复制控制器代码或将其移动到单独的项目中。它将在运行时从一个表示层切换到另一个表示层。

您应该能够通过实现自定义控制器工厂来实现这一点,以根据配置设置实例化正确的控制器类

您需要实现接口System.Web.Mvc.IControllerFactory。此接口中有两种方法:

1.System.Web.Mvc.IController CreateController(System.Web.Routing.RequestContext RequestContext,string controllerName)
-基于RequestContext和控制器名称创建控制器实例

2.void ReleaseController(System.Web.Mvc.IController controller)
-释放控制器实例


由于两个应用程序之间的区别在于视图,因此不需要将它们作为单独的项目。您可以有两组视图,并使用web配置中的不同设置部署同一项目两次。为此,您必须实现自己的ViewEngine,以便控制器能够返回正确的视图

public class AppSettingViewEngine: RazorViewEngine
{
    public AppSettingViewEngine()
    {
        string[] viewLocations = new string[] { };
        if (ConfigurationManager.AppSettings["Site"] == "WebA")
        {
            viewLocations = new[] {  
                "~/WebB/Views/{1}/{0}.cshtml",  
                "~/WebB/Views/{1}/{0}.cshtml",  
                "~/WebB/Views/Shared/{0}.cshtml",  
                "~/WebB/Views/Shared/{0}.cshtml",
            };
        }
        if (ConfigurationManager.AppSettings["Site"] == "WebB")
        {
            viewLocations = new[] {  
                "~/WebB/Views/{1}/{0}.cshtml",  
                "~/WebB/Views/{1}/{0}.cshtml",  
                "~/WebB/Views/Shared/{0}.cshtml",  
                "~/WebB/Views/Shared/{0}.cshtml",
            };
        }
        else
        {
            //Default Settings
            viewLocations = new[] {  
                "~/Views/{1}/{0}.cshtml",  
                "~/Views/{1}/{0}.cshtml",  
                "~/Views/Shared/{0}.cshtml",  
                "~/Views/Shared/{0}.cshtml",
            };
        }

        this.PartialViewLocationFormats = viewLocations;
        this.ViewLocationFormats = viewLocations;
    }
}
然后在应用程序中注册它,如下所示

protected void Application_Start()
{
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new AppSettingViewEngine());
}

我不确定这种方法,因为他们说他们的两个项目实际上是作为两个独立的站点部署的。如果将两个项目中的视图合并到一个项目中,我认为将不可能再单独部署它们了。@我不明白为什么不能单独部署它们。如果您更改web.config设置以使用正确的视图,如何阻止您将其部署到10个不同的服务器/站点?我指的是能够将这两组视图部署为不同的站点,因为这正是它们所需要的。您还可以查看以下链接: