Leg*_*end 7 c# asp.net asp.net-mvc asp.net-mvc-4
我最近遇到了一种在使用ASP.NET MVC3/4时开发可插拔应用程序模块的方法,我喜欢这种方法的简单性.目前,我的应用程序结构如下:

因此,任何想要为我的应用程序开发扩展的人都遵循上述教程中的方法,并创建一个保留在该Areas文件夹中的扩展.我想,当添加new Areas(创建为新项目)时,.pdb会创建文件并将其放在bin目录中.我的问题是:
Areas可插拔模块?Area放入bin文件夹时,应用程序会自动选择并创建链接?插件作者应该怎么做才能启用它?在我的_Layout.cshtml(全局共享布局)中,我执行以下操作来构建链接:
<ul>
<li>@Html.ActionLink("Area1", "Index", "Area1", new { Area = "Area1" }, null)</li>
<li>@Html.ActionLink("Area2", "Index", "Area2", new { Area = "Area2" }, null)</li>
<li>@Html.ActionLink("Area3", "Index", "Area3", new { Area = "Area3" }, null)</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
为简单起见,假设区域名称是唯一的.有关如何做到这一点的任何建议?
Ako*_*acs 10
不要在托管Web应用程序中创建区域,而是创建单独的项目,编译以分离dll.将dll复制到您要使用它的任何Web应用程序.请记住将所有静态文件设置为"EmbeddedResource".
您可以使用MvcContrib PortableAreaRegistration的"总线"将便携式区域中的消息和命令发送给"总线"上的任何人.这可以是托管网络应用程序,或理论上独立区域可以发送消息给对方.
在github上创建了两个粗略但功能性的演示代码:
https://github.com/AkosLukacs/PluggablePortableAreas
https://github.com/AkosLukacs/PluggablePortableAreasMVC4
首先,定义一条可以传递所需信息的消息.只是一个具有一些属性的POCO(PluggablePortableAreas.Common\RegisterAreaMessage.cs):
public class RegisterAreaMessage : IEventMessage
{
public string LinkText { get; private set; }
public string AreaName { get; private set; }
public string ControllerName { get; private set; }
public string ActionName { get; private set; }
//...
}
Run Code Online (Sandbox Code Playgroud)
为该消息类型创建一个处理程序(PluggablePortableAreas.Common\RegisterAreaEventHandler.cs):
public class RegisterAreaEventHandler : MessageHandler<RegisterAreaMessage>{}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,MessageHandler只是将收到的消息添加到静态ConcurrentBag<RegisterAreaMessage>.如果您愿意,可以使用DI,但希望保持简单.
您可以从便携式区域发送消息(Areas\DemoArea1\Areas\Demo1\Demo1AreaRegistration.cs):
//the portable area sends a message to the 'bus'
bus.Send(new RegisterAreaMessage("Link to the Demo area", AreaName, DefaultController, DefaultAction));
Run Code Online (Sandbox Code Playgroud)
通过迭代消息集合(PluggablePortableAreas.Web\Views\Shared_Layout.cshtml)显示动态添加的链接:
@foreach(var sor in PluggablePortableAreas.Common.RegisterAreaEventHandler.RegisteredAreas) {
<li>@Html.ActionLink(sor.LinkText, sor.ActionName, sor.ControllerName, new{Area=sor.AreaName}, null)</li>
}
Run Code Online (Sandbox Code Playgroud)
还有一件事需要注意:使用"完全限定"的区域名称.如果未明确指定区域名称,则MVC假定它是当前区域.没有区域没有问题,但第二个将指向"/path_to_your_app/CurrentArea/Home"而不是"/path_to_your_app/Home".
<li>@Html.ActionLink("Home", "Index", "Home", new { Area = "" }, null)</li>
<li>@Html.ActionLink("I don't work from the portable area!", "Index", "Home")</li>
Run Code Online (Sandbox Code Playgroud)
VS中的开发服务器感觉有点"不稳定",有时便携式区域无法加载.在完整的IIS中可靠地运行...
| 归档时间: |
|
| 查看次数: |
1834 次 |
| 最近记录: |