一个Action多套View模版的设计

 

回到目录

模块化

这个问题是在做模块化设计时出现的,在Lind.DDD.Plugins模块里,需要对应的模块实体,模块管理者,模块标识接口等,开发时,如果你的功能点属于一个模块,需要实现IPlugins,而当实现了标识接口后,在应用程序启动时,会一次性将所有插件模块注册到你的系统里,在需要使用时,只要使用PluginManager管理者把对应的模块取出来即可,这个取出的过程是没有性能损耗的,它并不是反射!

更多Lind.DDD.Plugins的相关知识,请阅读大叔这篇文章《Lind.DDD.Plugins~插件模式的集成

模块化在UI层的体现

本文主要问题是在设计出多个模块是,在UI层如何根据选中的模块,渲染出不同的VIEW来,这个问题不是新技术,只需要使用Html.Partial这个扩展方法即可以实现,而大叔要说的是,我们设计模块时,应该把所有模块放在一个统一的目录,新来的模块View只要放到module即可,由于模块核心内容都写在对应的module中,controller/action变得更加轻薄,这时,我们很容易使用autofac这些IoC工具把需要的模块对象动态生产出来,这也是Lind.DDD.Plugins要做的事情,只不过,为了性能考虑,我们在程序启动时已经把所有模块注册了,对于核心业务的action,所有模块共用一个即可,如列表action使用Index,添加action使用Create,而controller我们使用比较公用的名称,如商品管理Product,订单管理Order,而具体的手机项目product和order及PC端的product和order完全在对应的module里去实现(逻辑上的实现),而它们的action只会路由的转发,即根据项目去选择渲染哪一个View。

WEB MVC下面Module的组成

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAR8AAAC0CAIAAAAimb+DAAAIUklEQVR4nO3dv24bNxzA8TyJhgAeIm3OG9wrZLHnPIDfISg8eHBmzx6MTEbGePByk7cWEFAkeYEYKOC2AYgGLeAOQlWK/0Ty9COPd98PiEJWdbozqi9Olo7lC/Wfvu+Xy6VK1HXd709/BEbXdc4NF4uFcQMYs2/ffksaT09/vths2ff90dFRxgudujATmXVt00p6oXf7xNSl79F5APqd+ib6nVvxBw+kyqlLTyvpBXp2dhau6+7TXVJdgR/trjj1obCcuvS0kl6pNzc34bouL98H6lKuk5X9o3FgzuPkxIUCcupa7Irf2Xq9Dtd1cnKyt67wPb4HOI+TwCAq/1ONPKenp+HAvnz+Gl9X4LzkfItoPIC6IKp0Xefn5+G6rq+vA3UBDSld1/39fbiujUP9ekBFpesC5oO6ACnUBUihLkAKdQFSGq7L/nC/9hEBOwrV1ff9YY/7/Pz83bufYq6sB2opVNerV6+yA3N+IbZNa/MjdWGECtW1WCxWq1VeYN2++WB7561w3ROqKFfX7e1tXmBD6jIuL8w4ciBbubqUUnmBxVw55ftUg6JQUdG6lFIXFxer1erx8TF+W4m6nBPAAvfEbAUYitbV9/1qtbq9vU3a9uB1OSenhP8ZeQPQlasrLy1FXWhW0c8MM9JSh6vLVwV1QUihul6+fJmXlhpWl4r4/2pE1mVvtf2Rv77gVKiu7LTU4LqAWgrVNQR1oVEN1AU0iroAKdQFSKEuQAp1AVIarou5yRi5QnUxNxkzVKgu5iZjhgrVtag0N9m+dinjAIA85eqqMjdZca0t6ilXl6oxN1lRF+opWpcqPjdZeSYRx8wy5p0kBipaV/m5ySpiXlbkbC4gVbm6qsxNVgPqcp7QgHhFPzMsPzdZDT53AdkK1VVrbrLvE/nw3GT9MWSGbIXqYm4yZqhQXUNQFxrVQF1Ao6gLkEJdgBTqAqRQFyCl4bqYm4yRa7Uu5iZj/JqpyzhNMTcZ41enrvV6nbpJt28OZfhKqJhrmgKP4aooZKhQV9/3y+UydasCdal9F+9SF5KUrqvv+6Ojo4yXKXWhOUXr2qaV9DLde3lhRl2+mcjGg+2tfM8P2MrVpaeV9Io8OzsL13X36S5Ql/LP3Uq6oay6mAyGsEJ1GWklvRxvbm7CdV1evq9VF592IKBEXev1erlcLnYlbR6u6+TkpO65C3Bq4/uu09PTcGBfPn+Nr0sF/+7Su/Kxt5L4rdG6NuqyL3oyXF9fO+sCKmqjrvv7+3BdG+UPDAhooy6gRdQFSKEuQAp1AVKoC5Ayu7qY0Yxi5lUXM5pR0sTrMk5TzGhGSS3VVX5Gs/JcDzX0N8E8NFNXyRnNyrMKEZCkjboKz2hW1IVDaKCu8jOalXXJPG8LkWHsdVWZ0ayC844JDJFGXVetGc2KunAI462r4oxmFfy7i7oQabx1DTdkRrPxibxiGjLSTbkuZjSjrinXxYxm1DXluoC69HJ+/uVX56AuIAd1AVKoC5BCXYAU6gKkUBcghboAKdS1w/iK2f7SOfAddNIlkQUuqsrbBRd8HRB17dCz6bru4eFhc/vh4cH4V75niH9dFngFO3cRs1/qOoi513V8daz/qJ+jNmltT1Z6YNSFGNTlrUtp/+OA7Y/Gw2zGXBXnGy37zsBV+YGDN57H3p1vR4FN7N8C2eZb1/HVsT42dx62Lv3HjBt70/LdCDzGedveHXUdxHzr2gifuzbvBrdvC7d/hh28LudJJnzkvnd9ziehriqoy12X8TGGQejcZWwVee4K/CvqqmvudRn0D9y3J67sT+Tt2/YjjXv0RxoPCOzR+bS+vRu7sP/pPJciA3UBUqgLkEJdgBTqAqRQFyCFugAp1AVImV1drJuMYuZVF+smo6SJ12Wcplg3GSW1VFfhdZPtS4Hsi4m4XAgBzdRVd91k+7bvMcBWG3VVXzd5e9sZG3XBqYG66q6brN+jPKcy6oLT2Ouqvm6ycQ91Id6o6xrDusn6PfZ8Kt+DATXmukaybrJ9D3Uh0njrGm7gusm+zzMWlkK/D1oz5bpYNxl1Tbku1k1GXVOuC6iLugAp1AVIoS5ACnUBUqgLkEJdgBTqAqRQ1w7jK2b7S+fAd9BJl0cVuIQqbxdc3nVA1LVDz6Zj3WQMM/e6WDc5fkOkoi7WTXYfYWC/iDTfulg32diR7zHINt+6Nlg3WVGXGOpi3WTqkjL3ugz6B+6sm0xjA1EXIIW6ACnUBUihLkBKTl2vr54ZDMbeQV0MhtSYV12+M3j1A2NMcsyork1IznWTqx8bY5JjynXZ5yjfusnVD5UxyTHxuozTlG/d5OqHypjkaKmuNx/SHq+i1540NtSF72QwAqOZut5+fP7+I22T7LpeX/2f0OaGkVn1/2yMJkYbdb39+PzX3wkv6+0fWhJ1MRiRo4G63n58/vFP2lsy+y8u29669D1SFyNjjL0uPa2kupLWTbafwdgXdTEyxqjrMtJKqitp3WT7GaiLMXyMt643H56//3g2RG6rEtdNtp8hUBelMSLHeOsaOFTKusnGts6Y+TiekTqmXFf8usnVj5YxyTHluuLXTa5+tIxJjinXFa/60TImOSZbF4NRfVAXgyE1cupKetMFzBZ1AVKoC5BCXYAU6gKkUNcO/StmxbrJGIa6dujZdKybjGHmXhfrJsdviFTUxbrJ7iMM7BeR5lsX6yYbO/I9BtnmW9cG6yYr6hJDXaybTF1S5l6XQf/AnXWTaWwg6gKkUBcghboAKdQFSKEuQAp1AVKoC5DScF3OFZCB8Wi1Lt8KyMB4NFOXcZryrYAMjEedutbrdeomXdwqkjbn9UFDfwHr+Q/4hJiMjLr+Bbnzo/XZOm0JAAAAAElFTkSuQmCC" alt="" />

程序启动时注册Module这个特殊的路由模块,让我们的mvc程序可以找个Module下面的Views,这个只对需要有具体Action时用,如果你的module只有view,action都有公用模块实现了,就不需要注册下面代码了!

 /// <summary>
/// 注册模块
/// </summary>
public class Module_routing : RazorViewEngine
{
public Module_routing()
{
//视图位置
ViewLocationFormats = new[]
{
"~/Views/{1}/{0}.cshtml",
"~/Views/Module/{1}/{0}.cshtml"
}; //分部视图位置
PartialViewLocationFormats = new[]
{
"~/Views/{1}/{0}.cshtml",
"~/Views/Shared/{0}.cshtml",
"~/Views/Module/Shared/{0}.cshtml",
"~/Views/Module/{1}/{0}.cshtml"
};
} public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
return base.FindView(controllerContext, viewName, masterName, useCache);
} public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
{
return base.FindPartialView(controllerContext, partialViewName, useCache);
}
}

在程序启动时,把它的实例注册进来

     protected void Application_Start()
{
AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
RegisterView_Custom_routing();
} protected void RegisterView_Custom_routing()
{
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new Module_routing());
}

而在公用的action里,一般来说,会接收一个moduleName或者ModuleId这种属性,然后生产对应的模块对象,把对象的结果传给对应的View即可。

       public ActionResult Index(string module)
{
var model=Plugins.PluginManager.Resolve<IShop>("module").GetModel();//这个地方不是反射,只是从容器里把对应的实例取出来
return View(model);
}

在主View上进行渲染对应项目的PartialView,同时把Model传给对应的View,一般代码如下

<ul>
<li>@Html.ActionLink("pc端", "index", new { module = "pc" })</li>
<li>@Html.ActionLink("h5端", "index", new { module = "h5" })</li>
<li>@Html.ActionLink("pad端", "index", new { module = "pad" })</li> </ul>
@Html.Partial("~/views/module/"+Request.QueryString["module"] + "/index.cshtml",Model) <!-- 渲染对应的模块下的页面,Model由公用action返回 -->

这样产生的好处就是,当你添加新的module时,只需要维护对应的Project即可,然后把主网站的Views/Module文件夹更新,同时在module数据表中添加新的模块,就实现的新模块对老项目的集成!这一切可以说与原项目是解耦合的,它们可以在不同的解决方案中完成,各自负责各位的业务逻辑!

aaarticlea/png;base64,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" alt="" />aaarticlea/png;base64,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" alt="" />

感谢各位对大叔框架的支持!

同时希望大家多多支持咱们.Net跨平台社区,支持善友大牛!

回到目录

View模版的设计的更多相关文章

  1. 爱上MVC~一个Action多套View模版的设计

    回到目录 模块化 这个问题是在做模块化设计时出现的,在Lind.DDD.Plugins模块里,需要对应的模块实体,模块管理者,模块标识接口等,开发时,如果你的功能点属于一个模块,需要实现IPlugin ...

  2. 52. 模版和设计元素——Lotus Notes的代码重用

    不论是理论上还是实用上,代码重用都是编程的一个重要议题.可以从两个角度来讨论代码重用. 一是逻辑上代码以怎样的方式被重用.既可以通过面向对象的思想普及以来耳熟能详的继承的方式.比如先建了一个车的基类, ...

  3. 转载《浅析MVC框架中View层的优雅设计及实例》

    在基于B/S的应用程序开发中,从基本的技术分工上来说就是两大块,一是软件显示界面,另一个是程序逻辑.在N年前的脚本语言时代,无论是asp.php还是jsp,我们基本是都是把这两者柔和在一起的.尽管我们 ...

  4. iOS UIKit:CollectionView之设计 (1)

    collection view(UICollectionView对象)使用灵活和可扩展的布局来描述有序的数据项,其一般情况下以网格的形式来展示内容,但并非一定如此. 1 基础 为了将数据展示在屏幕中, ...

  5. # Writing your first Django app--part 3 about view

    添加更多的view 写actually有用的view 使用模版来设计view 使用模版设计view的捷径:render() 抛出异常404 抛出异常404-快捷方法: get_object_or_40 ...

  6. Power BI for Office 365(四)Power View第一部分

    Power View是一种可以创建动态的交互式报表的工具,并且支持丰富多样的图表类型,在Power View中创建的报表可以很容易地进行分享,以及供查看报表的用户对Power View报表进行交互.从 ...

  7. [原] Android 自定义View步骤

    例子如下:Android 自定义View 密码框 例子 1 良好的自定义View 易用,标准,开放. 一个设计良好的自定义view和其他设计良好的类很像.封装了某个具有易用性接口的功能组合,这些功能能 ...

  8. Android App的架构设计:从VM、MVC、MVP到MVVM

    随着Android应用开发规模的扩大,客户端业务逻辑也越来越复杂,已然不是简单的数据展示了.如同后端开发遇到瓶颈时采用的组件拆分思想,客户端也需要进行架构设计,拆分视图和数据,解除模块之间的耦合,提高 ...

  9. Yii2的view需要链接跳转

    添加 use yii\helpers\Url; view中的连接 <?= Url::toRoute('post/index');?>//post为你的当前控制器名,index为view模版

随机推荐

  1. 10 Best TV Series Based On Hacking And Technology

    Technology is rapidly becoming the key point in human lives. Here we have discussed top TV shows whi ...

  2. poj1328

    Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 73588   Accepted: 16 ...

  3. 多线程的练习----妖,等待唤醒,代码重构,lock到condition

    × 目录 [1]需求 [2]妖的出现和解决 [3]等待唤醒 [4]代码重构 [5]改成Lock Condition ------------------------------------- 1,需求 ...

  4. sql 将某一列的值拼接成字符串

    ) set @str='' -- 必须先赋值 ))+',' from( select [objid],sfrq from tablename ) tb order by tb.sfrq print @ ...

  5. 很全的corel图像分类,场景识别图像库

    这是真正的Corel-5K图像集,共包含科雷尔(Corel)公司收集整理的5000幅图片,故名:Corel-5K,童鞋们可用于科学图像实验:分类.检索等.Corel-5k数据集是图像实验的事实标准数据 ...

  6. .NET使用QRCodeEncoder生成二维码

    ThoughtWorks.QRCode.dll版本 1.0.2774.19990 代码如下: /// <summary> /// 生成二维码图片 /// </summary> ...

  7. 第二篇、Swift_自定义 tabbar 的 badgeValue显示样式

    在实际的开发中,我们常常需要根据实际的需求,去改变bageValue的显示样式,默认是红色的背景,白色的字体颜色 使用方式: class BKTabBarController: UITabBarCon ...

  8. 网站添加到IIS和附件进程调试(新手使用篇)

    一.网站添加到IIS 做网站开发,很有必要把项目添加到IIS中,这对浏览和后期的调试很有帮助.怎么把网站添加到IIS上? 1). 打开IIS,然后操作步骤如下图: 选择Default Web Site ...

  9. onclick和onblur的冲突问题

    新浪首页的搜索框里面有一个使用ajax的下拉框.我们需要实现一个点击下拉框里面的一项,让搜索框里面的值变成这一项,同时下拉框消失的效果,但同时在点击其他地方的时候,这个下拉框也要消失.大致如图: 我们 ...

  10. 8个WEB前端创意HTML5动画应用精选

    和十几年前相比,现在的网页加入了很多动画元素,从之前的Flash到现在的HTML5,动画样式越来越丰富,动画制作也越来越便捷.本文精选了几款非常富有创意的HTML5动画应用,欣赏一下吧. 1.HTML ...