我正在构建一个cms,在编辑屏幕上可以编辑多个类型的页面,网址需要保持中立状态,如下所示:
foobar.com/edit/section/my-content-page-name
foobar.com/edit/section/my-gallery-page-name
foobar.com/edit/section/my-blog-page-name
在这种情况下,索引操作用于获取和发布。
目前我有一个庞大的ViewModel,它包含所有页面类型所需的所有数据。
我觉得这是非常错误的,并且为确定帖子上的页面更新类型提供了一个难看的解决方案。
如何保持Action相同,但将其与不同的强类型ViewModel一起使用?
这甚至可能吗?
public ActionResult Index(string page)
{
var model = _pageManager.GetSection(page, SelectedSite);
return View(model.PageType, model);
// renders appropriate View based on page type.
}
[Transaction]
[HttpPost]
[ValidateInput(false)]
public ActionResult Index(SectionIndexViewModel model)
{
// all page types post back to same action to update content etc.
// at this point SectionIndexViewModel is getting bloated with properties because it must cater for ALL page types data.
var action = Request["action"] ?? "";
// currently use this to determine what event has been triggered
switch (action.ToLower())
{
// then goes to update the appropriate page, blog or gallery
// etc.
答案 0 :(得分:0)
所有页面类型都回发到相同的操作以更新内容等。
有你的问题。同样的动作不应该处理所有回发。为每个功能(内容,图库,博客)创建一个控制器。这就是MVC的用途。
单一责任原则也适用于控制人员。
您甚至可以将控制器移动到类库,以获得CMS的插件体系结构。我在这里描述了如何:http://blog.gauffin.org/2012/05/griffin-mvccontrib-the-plugin-system/
答案 1 :(得分:0)
我设法通过一些我忘记的MVC基础来实现这一目标。
路由保持默认值。
对于每个ViewModel类型,我在表单中提供了一个额外的隐藏字段,其中包含页面/内容/ ViewModel的类型,例如:内容页面或博客页面等。
在Post动作中,我从这个隐藏字段中检查页面的类型。
然后使用TryUpdateModel
使用预期的ViewModel类型作为该页面类型。
其余的都很直接。
非常基本的东西。