用于多路径动作的Sane View / Controller方法

时间:2014-03-28 23:26:46

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

我在ASP.NET MVC上相当新,我有一个问题对大多数人来说可能很简单,但我仍然无法弄清楚什么应该是最好的方法。

所以,我有一个"注意"实体,注释控制器(具有标准索引,列表,创建,编辑,删除操作)和注释视图。谈到列表操作,可以调用""来自不同的来源。示例:我有一个项目,附有几个注释,我有一个用户,即创建此注释的用户。

我有4个(更多,但让我们说4个)场景:

  1. 列出所有笔记
  2. 列出某个项目的注释
  3. 从某个用户列出备注
  4. 为特定用户的某个项目列出备注
  5. 结果列表几乎相似,除了在某些情况下可能隐藏的一些列(以及上下文菜单等等。但是弄清楚如何设置它我认为我可以很好地处理它。)

    案例1

    ID原因金额项目用户

    案例2

    ID原因金额用户

    案例3

    ID原因金额项目

    案例4

    ID原因金额

    这是List动作的伪代码

            public ActionResult List(int? proj_id, int? user_id)
        {
            int requestType = proj_id.HasValue ? 1 : 0;
            requestType += user_id.HasValue ? 2 : 0;
    
            switch (requestType)
            {
                case 0: //no parameters
                    return View(getNotes());
                    break;
                case 1: //filter by project
                    ViewData[ViewDataConst.VIEW_HIDE_COLUMN_PROJECT] = true;
                    return View(getNotesByProject(proj_id));
                    break;
                case 2: //filter by user
                    ViewData[ViewDataConst.VIEW_HIDE_COLUMN_USER] = true;
                    return View(getNotesByUser(user_id));
                    break;
                case 3: //filter by project and user
                    ViewData[ViewDataConst.VIEW_HIDE_COLUMN_PROJECT] = true;
                    ViewData[ViewDataConst.VIEW_HIDE_COLUMN_USER] = true;
                    return View(getNotes(proj_id, user_id));
                    break;
            }
    
        }
    

    在相关的列表视图中,我有类似

    的内容
         @if (!ViewData[ViewDataConst.VIEW_HIDE_COLUMN_PROJECT]) 
         { 
            <th> Project Name </th>
         }
    

    我的问题是:这种做法是否正确?或者它是一个完整的WTF? 我应该有多个处理不同列的视图吗?即使行为几乎相同?多个控制器? ViewData是纯粹的邪恶吗? :)

    欢迎任何回复,建议和监禁提议。

1 个答案:

答案 0 :(得分:2)

首先,你应该问自己一个问题:将所有这一切放在一个行动中有什么好处?

我个人看不到一个。此外,你的方法有一个可怕的开关,可以增长和增长,直到它爆炸有时:)。还有2个可选参数,这些参数在调试时可能会很麻烦。

我的建议是为每个场景创建一个单独的操作,例如:

  1. ListForProject(int id)
  2. ListForUser(int id)
  3. ListAll()
  4. ListFor(int userId,int projectId)
  5. 从每个操作中,您可以返回完全相同的视图:

    return View("SharedViewName", yourNotes);
    

    您还可以从局部构建视图,并且每个操作都有自己的视图,只能将合适的局部放在合适的位置。通过这种方式,您的视图中的“ifs”会更少 - 视图中的“ifs”越少越好。

    说到ViewBag / ViewData,它们有时很有帮助,但通常最好将视图的数据包装在一个简单的ViewModel类中。