.NET Framework 4.5如何跨项目/模块映射HomeController
问题描述
现有基于ASP.NET MVC(VB语言、.NET Framework 4.5)的应用程序,原HomeController.vb已转换为HomeController.cs并放置在独立项目/模块中,命名空间为Admin。需要修改原项目的RouteConfig.vb,配置路由以访问新HomeController的Login方法。
原VB控制器代码:
Imports System.Web.Mvc Namespace Controllers Public Class HomeController <AllowAnonymous> Function Login() As ActionResult If Not User Is Nothing AndAlso User.Identity.IsAuthenticated = True Then Return Redirect("/mvc/action/main") Else Return Redirect("/mvc") End If End Function End Class End Namespace
新C#控制器代码:
using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Security; using System.Text; using System.Threading.Tasks; using Microsoft.VisualBasic; using System.Web.Mvc; namespace Admin { public class HomeController { [AllowAnonymous] public ActionResult Login() { if (User != null && User.Identity.IsAuthenticated) return Redirect("/mvc/action/main"); else return Redirect("/mvc"); } } }
原路由配置示例:
routes.MapRoute( name:="login", url:="login", defaults:=New With {.controller = "Home", .action = "Login"} )
解决方案
因为新的HomeController位于Admin命名空间,而原项目控制器默认在Controllers命名空间,MVC路由需要明确指定命名空间才能定位到正确的控制器,避免同名控制器冲突。修改RouteConfig.vb的路由配置如下:
1. 带命名空间的路由配置
routes.MapRoute( name:="login", url:="login", defaults:=New With {.controller = "Home", .action = "Login"}, namespaces:=New String() {"Admin"} ' 指定新控制器所在的命名空间 )
2. 关键注意事项
- 确保包含新C#控制器的项目已被原ASP.NET MVC项目引用,否则路由无法找到目标控制器。
- 修正新C#控制器的逻辑错误:原代码
!User == null是语法逻辑错误,应改为User != null(上述代码示例已修正),否则会导致身份验证判断反向。 - 如果原项目中仍保留旧的
HomeController(Controllers命名空间下),必须通过命名空间区分,否则MVC会因找到多个同名控制器抛出异常。
内容的提问来源于stack exchange,提问作者suryakumar101987
相关产品推荐
相关产品推荐

