我在ASP.NET MVC上相当新,我有一个问题对大多数人来说可能很简单,但我仍然无法弄清楚什么应该是最好的方法。
所以,我有一个"注意"实体,注释控制器(具有标准索引,列表,创建,编辑,删除操作)和注释视图。谈到列表操作,可以调用""来自不同的来源。示例:我有一个项目,附有几个注释,我有一个用户,即创建此注释的用户。
我有4个(更多,但让我们说4个)场景:
结果列表几乎相似,除了在某些情况下可能隐藏的一些列(以及上下文菜单等等。但是弄清楚如何设置它我认为我可以很好地处理它。)
即
案例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是纯粹的邪恶吗? :)
欢迎任何回复,建议和监禁提议。
答案 0 :(得分:2)
首先,你应该问自己一个问题:将所有这一切放在一个行动中有什么好处?
我个人看不到一个。此外,你的方法有一个可怕的开关,可以增长和增长,直到它爆炸有时:)。还有2个可选参数,这些参数在调试时可能会很麻烦。
我的建议是为每个场景创建一个单独的操作,例如:
从每个操作中,您可以返回完全相同的视图:
return View("SharedViewName", yourNotes);
您还可以从局部构建视图,并且每个操作都有自己的视图,只能将合适的局部放在合适的位置。通过这种方式,您的视图中的“ifs”会更少 - 视图中的“ifs”越少越好。
说到ViewBag / ViewData,它们有时很有帮助,但通常最好将视图的数据包装在一个简单的ViewModel类中。