我对MVC比较新,所以这可能是一个新手问题.
我试图了解如何在一些看似不直接的情景中保持明确的关注点分离的最佳实践.
我现在正在看两种情况.想象一个非常基本的应用程序,让用户可以查看和编辑律师的在线个人资料.有一个动作/视图可显示特定用户的个人资料,还有一个动作/视图可用于编辑特定用户的个人资料.很容易想象一个漂亮而干净的Model类来表示用户配置文件的详细信息,可能是使用Entity Framework进行的,并映射到用户配置文件sql表.
在用于显示用户配置文件的视图操作/视图中,在功能上,我需要一个允许用户编辑配置文件的按钮或链接.但这应该只对某些用户子集可用.例如,用户可以编辑自己的个人资料.此外,超级用户可以编辑任何人的个人资料.我的问题是View在呈现特定配置文件时应该如何确定链接是否存在.我认为View包含逻辑以确定当前用户是否可以编辑当前配置文件是错误的.我应该将IsEditable属性添加到UserProfile模型类吗?这并不悲惨,但也感觉不完全正确.我应该创建一个新的Model类来聚合UserProfile以及有关安全性的其他信息吗?
另一种情况……编辑特定的个人资料时,其中一个可编辑的内容是特定律师的专业列表.可能的专业清单并不固定.如果视图想要在组合框中呈现它们,则它需要从数据库中列出所有可能的特性.视图不应该直接从数据库中获取它们,所以我是否再次进行聚合模型事物并为View提供UserProfile和有效专业列表?
我想我想弄清楚的一般问题是我应该适应创建大量特定于各个视图的小型Model类.每个类都包含该特定视图所需的较大域模型的各个不相关部分.
解决方法
对于您的场景,我传递了ViewData中的另一个参数ViewData [“AllowEdit”],如果View应该显示编辑链接,则该参数设置为true.我更喜欢将模型克隆到特定于视图的模型中以添加此单个属性.我有时会创建视图特定的模型 – 例如我有Grid ViewUserControl,它采用Grid模型,我可以从其他模型类的任何列表中生成 – 但在这种情况下我不会.
在我看来,我会做这样的事情:
<% if (Convert.ToBoolean(ViewData["AllowEdit"])) { %> <%= Html.ActionLink("Edit","Edit","Profile",new { id = ViewData.Model.ID },null ) %> <% } %>