使用独立的动态库为Asp.Net MVC5 增加区域

我们需要为现有的项目创建扩展,为了防止控制器发生冲突,需要使用区域,为了不重新修改和编译现有的项目,我们需要创建独立的动态库。首先,创建一个.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" }
            );
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。