新社区网站

通常情况下,你会在正确的位置,但我们最近推出了一个全新的社区网站…为了社区,靠社区。

耶……带我去社区!

社区博客是社区成员的个人观点,绝不是DNN公司或DNN平台的官方立场。这是一个表达个人对DNNPlatform、社区及其生态系统的想法的地方。你有有用的信息,你想分享与DNN社区的特色文章或博客?如有,请联系

社区博客的使用由我们的社区博客指南-请在评论或张贴前阅读。


dnn8:6模块开发-处理MVC和SPA模块中的模块动作

dnn8将支持使用ASP创建模块。NET MVC 5.1版(或更高版本)以及使用SPA(单页应用程序)模块使用HTML 5, JavaScript和ASP。NET Web API。在本系列之前的博客中,我已经描述了如何构建这些模块,并展示了如何处理本地化。还需要描述的一个主题是这两种方法如何注册模块操作,以便它们显示在DNN的模块操作菜单上。

ModuleAction属性

我将从如何为MVC模块注册模块动作开始。在Web表单的后台代码文件中,你可以通过实现IActionable接口来添加Module Actions。这种方法在MVC控制器中是不可能的,因为控制器可以有许多“视图”,每个视图都需要自己的一组模块动作。因此,我们决定添加一个新的ModuleAction属性,实现为MVC Action Filter。此属性允许您定义模块动作。

清单1:ModuleAction属性

1:(HttpGet)
2:[ModuleAction (ControlKey =“编辑”, TitleKey =“AddContact”)]
3:公共ActionResult指数()
4:{
5:var联系人= _repository.GetContacts(PortalSettings.PortalId);
6:
7:返回视图(contacts.ToList ());
8:}

每个ModuleAction属性将向Module Actions菜单中添加一个ModuleAction。在本例中,模块操作是“Edit”操作,其标题由本地化键“AddContact”定义。ModuleAction属性公开了以下属性:

  • ControlKey -用于识别要加载的模块控件的键
  • 图标-图标要使用的Url
  • SecurityAccessLevel -安全访问级别设置
  • 标题-显示在Actions菜单中的标题(文本)
  • TitleKey -标题的本地化键(如果出现这个将覆盖标题设置)

每个ModuleAction属性定义一个ModuleAction。对于复杂的模块,这可能意味着Action方法可能有很多ModuleAction属性。此外,该属性只定义了ModuleAction属性的一个子集——它旨在提供一个简单的解决方案来覆盖80%的用例。为了涵盖更复杂的情况,我们还包含了ModuleActionItems属性。

ModuleActionItems属性

ModuleActionItems属性也被实现为一个动作过滤器。它有两个参数:

  • 类型——类的类型(如果不存在,默认为当前控制器)
  • MethodName -由Type参数定义的类中要调用的方法的名称。如果不显示,默认为“Get{actionmethods}Actions”,其中{ActionMethod}是应用属性的动作方法的名称。

作为一个例子,让我们用ModuleActionItems属性替换清单1中的单个ModuleAction属性。代码更改如清单2所示。

清单2:ModuleActionItems属性

1:(ModuleActionItems)
2:公共ActionResult指数()
3:{
4:var联系人= _repository.GetContacts(PortalSettings.PortalId);
5:
6:返回视图(contacts.ToList ());
7:}
8:
9:私人ModuleActionCollection GetIndexActions ()
10:{
11:var行动=ModuleActionCollection ();
12:
13:行动。Add (ModuleAction (1)
14:{
15:CommandName = ModuleActionType。AddContent,
16:commandcommandment =字符串。空的,
17:图标=字符串。空的,
18:标题= LocalizeString(“AddContact”),
19:Url = ModuleContext。EditUrl (“编辑”),
20:Secure = SecurityAccessLevel。编辑,
21:UseActionEvent =
22:可见=真正的
23:NewWindow =
24:});
25:
26日:返回行动;
27日:}

本质上,ModuelActions属性就像IActionable一样,返回模块操作的集合。

模块SPA模块中的动作

SPA模块的原则之一是使用单页应用程序样式构建它们。这本质上意味着模块不需要任何模块操作来加载第二个“页面”。但是为了完整性,我们添加了一个ModuleAction令牌。ModuleAction令牌的工作方式类似于我在前面描述的其他基于JSON的令牌博客,它的工作方式类似于ModuleAction属性,暴露了相同的参数集。

  • controlKey
  • 图标
  • securityAccessLevel
  • 标题
  • titleKey

它还添加了一个额外的参数,以便您可以为titleKey字段标识“localResourceFile”。例如,上面使用的Edit ModuleAction的令牌是:

[ModuleAction: {controlKey: " Edit ", securityAccessLevel: " Edit ", titleKey: " AddContent ", localResourceFile: " ~/DesktopModules/Dnn/ContactList/App_LocalResources/ContactList.]resx“})

所以现在你可以将模块动作添加到你的MVC或SPA模块中——享受这种新的开发风格,并让我们知道你的想法。


欲了解更多信息

评论

Vishves Bhesania
谢谢你的好文章。

当我在发布模式下调试这个项目时,我得到了如下错误:

could not find ContactList_mvc.dnn.dnn
无法找到ContactList_spa.dnn.dnn

请进一步帮助我。
Vishves Bhesania 2015年10月3日星期六凌晨1:31 (链接)
Danylo Kizyma
嗨,查尔斯,谢谢你的这篇文章。我有一个问题-与SPA模块一起使用Session对象的首选方式是什么?

谢谢。
Danylo
Danylo Kizyma 2015年10月13日星期二下午2:40 (链接)
tianxiξ
嗨,查尔斯,感谢这篇文章,我有一个问题,如何包安装zip。谢谢。
tianxiξ 2016年1月19日星期二凌晨1:52 (链接)
将Strohl
供您参考——如果您复制并粘贴这里的代码片段,请务必替换引号,并纠正一些空格问题。

这个:[ModuleAction: {controlKey: " Edit ", securityAccessLevel: " Edit ", titleKey: " AddContent ", localResourceFile: " ~/DesktopModules/Dnn/ContactList/App_LocalResources/ContactList.]resx“})

应该是:[ModuleAction:{controlKey: "Edit", securityAccessLevel: "Edit", titleKey: "AddContent", localResourceFile: "~/DesktopModules/Dnn/ContactList/App_LocalResources/ContactList.]resx“})
将Strohl 2016年9月29日星期四晚上8:03 (链接)
阿拉斯加尼姆
你好,
只是想提一下,当使用最新的DNN版本9时,上面的私有方法(GetIndexActions)应该设置为公共,以避免此错误:
(错误)
无法找到获取模块操作的预期方法。类型:Dnn.Modules.TaskList.Controllers。方法:GetIndexActions
(/错误)
阿拉斯加尼姆 2017年2月20日星期一上午11:09 (链接)

评论形式

只有注册用户才能发表评论。

NewsArchives


艾德森·奥利维拉(22岁)
亚历克·惠廷顿(11岁)
亚历山德拉·戴维斯(3)
亚历克斯·雪莉(10岁)
安德鲁·霍弗林(3)
安德鲁·纳斯(30岁)
安迪·特里巴(1)
安东尼·格伦赖特(5岁)
安东尼奥·沙古里(28岁)
阿什·普拉萨德(37岁)
本·施密特(1)
本杰明·赫尔曼(25岁)
伯努瓦·萨顿(9)
贝丝·菲尔博(12岁)
比尔·沃克(36岁)
鲍勃·克鲁格(5)
Bogdan Litescu (1)
布莱恩·杜克斯(2)
布莱斯·雪(1)
布鲁斯·查普曼(20岁)
布莱恩·安德鲁斯(1)
卡萨尔·康诺利(55岁)
查尔斯·纳斯(163)
克里斯·哈蒙德(213岁)
克里斯·帕特拉(55岁)
克林特·帕特森(108岁)
Cuong Dang(21岁)
丹尼尔·巴塞洛缪(2)
丹尼尔·梅特勒(181岁)
丹尼尔·瓦拉达斯(48岁)
戴夫·巴克纳(2)
大卫·波因德克斯特(12岁)
大卫·罗德里格斯(3)
丹尼斯·萧(1)
道格·豪厄尔(11)
埃里克·范·巴列戈伊(30岁)
恩斯特·彼得·塔明加(80岁)
弗朗西斯科·佩雷斯·安德烈斯(17岁)
杰夫·巴洛(12岁)
乔治·阿拉特拉什(12)
吉福德·沃特金斯(3)
吉尔·勒·小猪(3)
伊恩·罗宾逊(7岁)
以色列·马丁内斯(17岁)
简·布隆奎斯特(2)
简·乔纳斯(3)
Jaspreet Bhatia (1)
珍妮·梅里菲尔德(6岁)
乔·布林克曼(274)
约翰·米切尔(1)
乔恩·亨宁(14岁)
乔纳森·希利(4)
乔丹·库珀史密斯(1)
约瑟夫·克雷格
侃妈(1)
凯万·贝吉(3)
凯利·福特(4岁)
肯·格里尔森(10岁)
凯文·施赖纳(6岁)
利·波波特(31岁)
洛林·杨(60岁)
马利克·汗(1)
马特·拉特利奇(2)
马提亚斯·施罗曼(16岁)
毛里西奥Márquez (5)
迈克尔·多克西(7岁)
迈克尔·托比什(3)
迈克尔·华盛顿(202岁)
米格尔·加特梅坦(3)
迈克·霍顿(19岁)
米切尔·塞勒斯(40岁)
内森·罗孚(3)
Navin V Nagiah (14)
Néstor Sánchez (31)
尼克·卡利亚尼(14岁)
奥利弗·海因(1)
帕特里西奥·f·萨利纳斯(1)
帕特里克·瑞恩(1)
彼得·唐克尔(54岁)
菲利普·比德尔(135岁)
菲利普·贝克(4)
理查德·大仲马(22岁)
罗伯特·J·柯林斯(5)
罗杰·塞尔温(8)
鲁本·洛佩兹(1)
瑞恩·马丁内斯(1)
Sacha Trauwaen (1)
Salar Golestanian (4)
桑杰·梅赫罗特拉(9)
斯科特·麦卡洛克(1)
斯科特·施莱西尔(11)
斯科特·威尔金森(3)
斯科特·威尔海特(97岁)
塞巴斯蒂安·利乌波尔德(80岁)
肖恩·沃克(237)
肖恩·梅哈菲(17岁)
斯蒂芬·卡尔曼(12岁)
斯蒂芬·坎普伊斯(12岁)
史蒂夫·法比安(31岁)
史蒂文·费舍尔(1)
蒂莫·布鲁梅尔霍夫(24岁)
托尼·亨里奇(3)
Torsten Weggen (3)
第谷·德·沃德(4)
Vicenç Masanas (27)
文森特·阮(3)
维塔利·科扎达耶夫(6岁)
威尔·摩根威克(40岁)
威尔·斯特罗尔(180岁)
威廉·塞弗伦斯(5)
什么是液体含量?
找出
什么是液体含量?
找出
什么是液体含量?
找出
Baidu
map