2010-02-09 98 views
1

你将如何在ASP.NET MVC 2中创建动态布局,管理员可以选择小部件来显示,排列它们,禁用,移动它们等。我的意思是灵活的布局,可以通过管理面板进行更改,而无需触摸代码。在这里我想到了在db中定义和存储布局小部件路径。后来我可以将这些小部件与路由(在db中)关联起来。对于每个请求(控制器,动作),我将使用关联的小部件获取布局,并递归输出它们。可能我可以使用RenderAction和PartialViews。ASP.NET MVC 2动态布局

我的方向是否正确,还是应该关注其他一些技巧?

感谢, 的Jakub

+0

当你说灵活的布局,你的意思是只看和定位或添加和删除内容? 在第一种情况下,您可以使用CSS/Js和路径做些事情,否则您必须变得更聪明,管理员会做多少事?他们可以触摸HTML的代码(即你会让他们访问您的意见?) – roundcrisis 2010-02-09 18:39:55

回答

2

Rob Conery在他的Kona改写中做了类似的事情。他能够在页面中创建区域,然后将窗口小部件关联到这些区域。

有浮现在脑海两种方法:

1)首先是加载所有的部件在控制器的行动和他们持有的内容。然后将小部件(模型中)的所有信息发送到您的视图,并在那里进行过滤。这保留了视图和控制器之间的分离。你可能会想创建一个辅助方法:

在第一种方法
<% Html.RenderWidgets("Main", Model.Widgets) %> 

<% Html.RenderWidgets("SideBar", Model.Widgets) %> 

一个说明。您可能需要某种命名约定,以便您可以更轻松地找到其局部视图。

2.)另一种方法是使用RenderAction并调用一个可以传递区域名称的“RegionController”。传递区域名称将触发查询属于该特定区域的所有小部件。

<% Html.RenderAction<RegionController>(x=>x.Widgets("Main")) %> 

<% Html.RenderAction<RegionController>(x=>x.Widgets("SideBar")) %> 

我个人会做第一种方法,但我看不出有问题,不是从纯粹主义者的呼喊其他的第二种方法。

+0

假设小工具是一个有序列表我认为第一个例子是最简单的。 – 2010-02-09 18:44:55

+0

是的小工具最有可能是一个IEnumerable 或ICollection 与小部件有一些可区分的属性,像widget.Region ==“主” – 2010-02-10 17:58:51

+0

谢谢哈立德!这是我的第一个想法。我想第一个解决方案应该更快,因为每个小部件不必运行路由管道。 – Cosmo 2010-02-12 01:44:44

1

如果你想小部件的互动拖和下降,使用jQuery或ExtJS的。 ExtJS有一个完整的portal example

如果您不想使用JavaScript,您需要滚动一个自定义解决方案,其中定义了区域并填充动态加载的部分视图。

+0

感谢戴夫,我不想使用JQuery。我会采取第二种解决方案。 – Cosmo 2010-02-12 01:41:33