加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 这个显示逻辑应该存在于ViewModel中还是映射层中?

发布时间:2020-12-15 21:43:05 所属栏目:百科 来源:网络整理
导读:我最近开始了一个MVC项目,现在似乎每隔5分钟就会面临关于如何使用这个东西的大型关键设计决策.总是这样,对吗? 我决定将我的域模型类完全保留在Views之外;它将导致大量类似外观的ViewModel,但使用AutoMapper我不认为这将是一个问题,我认为这是一个很好的干净
我最近开始了一个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.也似乎是一个不错的选择.您不应该担心将转换放在映射逻辑中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读