如何实现多个ViewModel类型以对get和posts使用相同的Action?

时间:2012-08-21 12:27:11

标签: c# asp.net-mvc-3

我正在构建一个cms,在编辑屏幕上可以编辑多个类型的页面,网址需要保持中立状态,如下所示:

foobar.com/edit/section/my-content-page-name
foob​​ar.com/edit/section/my-gallery-page-name
foob​​ar.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.

2 个答案:

答案 0 :(得分:0)

  

所有页面类型都回发到相同的操作以更新内容等。

有你的问题。同样的动作不应该处理所有回发。为每个功能(内容,图库,博客)创建一个控制器。这就是MVC的用途。

单一责任原则也适用于控制人员。

您甚至可以将控制器移动到类库,以获得CMS的插件体系结构。我在这里描述了如何:http://blog.gauffin.org/2012/05/griffin-mvccontrib-the-plugin-system/

答案 1 :(得分:0)

我设法通过一些我忘记的MVC基础来实现这一目标。

路由保持默认值。

对于每个ViewModel类型,我在表单中提供了一个额外的隐藏字段,其中包含页面/内容/ ViewModel的类型,例如:内容页面或博客页面等。

在Post动作中,我从这个隐藏字段中检查页面的类型。

然后使用TryUpdateModel使用预期的ViewModel类型作为该页面类型。

其余的都很直接。

非常基本的东西。