将自主化的Asp.NET MVC 5添加到现有的winforms / console项目中

时间:2015-08-22 08:06:56

标签: model-view-controller asp.net-mvc-5

如何在现有的winforms项目中添加自主Asp.Net MVC 5应用程序? 我已经将自主式mvc 5应用程序作为单独的控制台应用程序正常工作。

但是,现在我需要将这个MVC 5项目加载到现有winforms应用程序的子文件夹中,我需要调用控制器内部现有的业务逻辑类。

我很感激任何指导。

感谢。

1 个答案:

答案 0 :(得分:1)

在Web上关于向现有WebForms应用程序添加MVC支持。这两个人在同一个项目中很好地并排发挥作用

首先,您需要将MVC项目设为便携式区域。有关这方面的详细信息,请访问here。便携式区域是一个dll,其中包含通常属于您的解决方案的项目。可移植区域包含视图,控制器,模型,甚至JS脚本,CSS文件和图像。

便携式区域的缺点:

每次对便携式区域内的任何视图,JS文件,CSS文件或图像进行更改时,都需要重建它。我强调这些组件,因为它们通常不需要在测试或开发时重建。

这可能会成为一个问题。如果您每次调整CSS时发现自己重新构建,则30秒更改将变为2分钟更改。制作其中的30个,并将你的工作时间延长到2个小时。

接下来,您需要更新web.config文件。用以下内容替换默认编译部分:

<compilation debug="true" targetFramework="4.0">
<assemblies>
    <add assembly="System.Web.Abstractions, Version=4.0.0.0, 
         Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Routing, Version=4.0.0.0, 
         Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Mvc, Version=2.0.0.0, 
         Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</assemblies>

还添加一个带有显示名称空间的页面元素:

<pages>
    <namespaces>
        <add namespace="System.Web.Mvc"/>
        <add namespace="System.Web.Mvc.Ajax"/>
        <add namespace="System.Web.Mvc.Html"/>
        <add namespace="System.Web.Routing"/>
    </namespaces>
</pages>



<system.webServer>
  <validation validateIntegratedModeConfiguration="false"/>
  <modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>

并为MVC添加MVC HTTP处理程序和绑定重定向:

<httpHandlers>
    <add verb="*" path="*.mvc" 
        validate="false" type="System.Web.Mvc.MvcHttpHandler,
        System.Web.Mvc, Version=2.0.0.0, Culture=neutral, 
        PublicKeyToken=31BF3856AD364E35"/>
</httpHandlers>

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

现在在我们的Global.asax文件中,我们需要注册便携式区域:

public class SomeHybrid: System.Web.HttpApplication
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

    }

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }
}

现在,此时我可以访问这两个页面。 WebForms页面是磁盘上的文件,因此当我/default.aspx时,ASP.NET路由将请求直接传递到此页面。 ASP.NET路由引擎已经启用,所以我也可以点击/ Home / Index。

如果我想获得幻想,您可以添加PageRoute,以便在访问我的WebForms页面时也可以使用漂亮的URL。只需像这样添加Global.asax中的路由。确保像这样的简单路由首先出现,因为默认的ASP.NET MVC路由非常“贪婪”#34;并会吞噬像/ calculator

这样的简单网址
routes.MapPageRoute("WebFormThing", "Calculator", "~/Default.aspx");