c# – 这个显示逻辑应该存在于ViewModel中还是映射层中?
我最近开始了一个MVC项目,现在似乎每隔5分钟就会面临关于如何使用这个东西的大型关键设计决策.总是这样,对吗?
我决定将我的域模型类完全保留在Views之外;它将导致大量类似外观的ViewModel,但使用AutoMapper我不认为这将是一个问题,我认为这是一个很好的干净方法. 然而,我最近的辩论围绕着显示逻辑.假设我有一个模型MyData,其属性为Status.这是一个如下的枚举: public enum Status { Ok,NotTooGreat,CouldBeBetter,Awful } 在一个视图中,当我渲染这个模型时,我想输出状态,并根据情况的糟糕程度为输出添加颜色.例如如果它没问题,我会显示绿色,如果它是NotTooGreat或CouldBeBetter而不是黄色,否则显示为Awful的红色. 这个逻辑应该在哪里生活?最终,颜色选择本身将在视图内(例如,确定要输出的css类,该类控制颜色),但确定状态是什么是我认为不应该在视图中的决定.可能的选择是: >在自定义ViewModel类中使用DataAnnotations,例如 public class MyDataViewModel { /* Amongst other MyData properties required... */ public StatusViewModel Status; } public enum StatusViewModel { [StatusDisplay(DisplayState.Ok)] Ok,[StatusDisplay(DisplayState.Warning)] NotTooGreat,[StatusDisplay(DisplayState.Warning)] CouldBeBetter,[StatusDisplay(DisplayState.Error)] Awful } 这意味着我的映射相当愚蠢,可以按值映射枚举.然后,View将依赖HtmlHelper根据DataAnnotation更改输出.这看起来相当简单,但是这会在ViewModel中放置太多“业务”逻辑吗?也就是说,这不仅仅是一个UI关注点,因此ViewModel定义显示状态是完全有效的吗?我可能会以这种方式结束大量的自定义DataAnnotations吗?如果我还需要说明用户可以根据当前状态执行哪些操作,这些不会变得臃肿吗? public class MyDataViewModel { /* Amongst other MyData properties required... */ public string StatusText; public DisplayState Status; } 这意味着ViewModel不知道什么状态与DisplayState有关,它只知道可能存在哪些不同的DisplayStates(即Ok,Warning或Error).然而,这需要逻辑然后坐在映射代码中,这对我来说感觉不像“映射” – 直到现在模型ViewModel之间的映射一直是控制器的直接调用 – 但也许这是一种不必要的恐惧? 我想我倾向于第一,但我会欣赏别人的意见.我想到的一件事是,这是一个非常简单的例子,但如果View更加复杂呢?比如说,如果MyData的状态为Ok,我们想要从MyData模型向用户显示更多属性,或者从其他Model类中提取数据? 解决方法
对于这个特殊情况,我认为3.更容易 – 在视图模型上保留一个Status enum属性,并有一个自定义帮助器来格式化它.我不喜欢1.因为你复制了相同的枚举,你最终可能会得到大量的数据注释.这似乎没必要.
顺便说一句2.也似乎是一个不错的选择.您不应该担心将转换放在映射逻辑中. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |