微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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吗?如果我还需要说明用户可以根据当前状态执行哪些操作,这些不会变得臃肿吗?
>保持viewmodel简单,并依赖Mapping代码来存放逻辑:

public class MyDataviewmodel {
     /* Amongst other MyData properties required... */
     public string StatusText; 
     public displayState Status;
}

这意味着viewmodel不知道什么状态与displayState有关,它只知道可能存在哪些不同的displayStates(即Ok,Warning或Error).然而,这需要逻辑然后坐在映射代码中,这对我来说感觉不像“映射” – 直到现在模型viewmodel之间的映射一直是控制器的直接调用 – 但也许这是一种不必要的恐惧?
>这应该在视图中,viewmodel应该与Model保持一致,然后在View或HtmlHelper中的某些代码将根据Status是什么来决定输出什么类.

我想我倾向于第一,但我会欣赏别人的意见.我想到的一件事是,这是一个非常简单的例子,但如果View更加复杂呢?比如说,如果MyData的状态为Ok,我们想要从MyData模型向用户显示更多属性,或者从其他Model类中提取数据?

解决方法

对于这个特殊情况,我认为3.更容易 – 在视图模型上保留一个Status enum属性,并有一个自定义帮助器来格式化它.我不喜欢1.因为你复制了相同的枚举,你最终可能会得到大量的数据注释.这似乎没必要.

顺便说一句2.也似乎是一个不错的选择.您不应该担心将转换放在映射逻辑中.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐