我们需要为现有的项目创建扩展,为了防止控制器发生冲突,需要使用区域,为了不重新修改和编译现有的项目,我们需要创建独立的动态库。首先,创建一个.Net Framework的类库项目,使用NuGet包管理器引入Mvc:
图片.png
然后在项目中创建Areas目录,在该目录下创建以区域名命名的子目录,在这个目录下创建Controllers目录,然后就可以在Controller目录下添加控制器了:
图片.png
控制器的代码与一般控制器没有不同,示例代码片段如下:
namespace Plat.Framework.Component.Areas.Plat.Controllers
{
public class MainPageController : Controller
{
public MainPageController()
{
}
// GET: /<controller>/
public ActionResult Index(string name)
{
if (string.IsNullOrEmpty(name))
{
name = "index";
}
var res = GetModel(name);
return View(res);
}
}
接下来是重要的一步,需要在Areas目录下为每个区域都创建区域控制器注册类:
using System.Web.Mvc;
namespace TestHostFramework.Areas.Plat
{
public class PlatAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Plat";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Plat_default",
"Plat/{controller}/{action}/{name}",
new { controller="MainPage", action = "Index", name = UrlParameter.Optional },
namespaces: new string[] { "Plat.Framework.Component.Areas.Plat.Controllers" }
);
}
}
}
这里需要注意的是,为了防止不同区域的控制器名称相同,需要在路由中定义绑定的名称空间:
namespaces: new string[] { "Plat.Framework.Component.Areas.Plat.Controllers" }
在部署时,将控制器类库dll拷贝到宿主网站的bin目录下,将相关区域视图部署在宿主网站的Areas/<区域名称>/Views目录下:
图片.png
就可以了。
还有两点需要注意:
1)宿主网站的Global.asax-》Application_Start中,必须有AreaRegistration.RegisterAllAreas();
2)宿主网站的路由定义中最好也有名称空间限制,防止控制器名称冲突:
routes.MapRoute(
name: "Default",
url: "{name}",
defaults: new { controller = "MainPage", action = "Index", name = UrlParameter.Optional },
namespaces: new string[] { "Plat.Framework.Component" }
);