将视图逻辑放在强类型视图数据类中是否可以接受?

时间:2009-10-16 19:30:00

标签: asp.net-mvc uiviewcontroller viewdata

假设你有一个视图需要一些数据需要一些计算,但没有外部依赖。 (例如,过去5年的可枚举字符串列表。)将它放在强类型视图类中是否可以接受?

这样的事情:

class HomeIndexViewData
{

// ...some view data...

public IEnumerable<String> LastThreeYears
        {
            get
            {
                return new string[] { 
                    DateTime.Now.Year.ToString(), 
                    (DateTime.Now.Year - 1).ToString(), 
                    (DateTime.Now.Year - 2).ToString() };
            }
        }
}

现在,如果该计算依赖于视图数据类中的某些其他属性,该怎么办?假设如果年份出现在日期列表中,那么“LastThreeYears”属性会在年末添加星号吗?

免责声明:这仅适用于特定于单个视图的数据,并且无法由存储库,视图模型等正确处理。

一方面,在我看来,视图数​​据应该只是:一个毫无生气的属性集合,它们只是从控制器传递给视图。另一方面,这是非常漂亮的。

2 个答案:

答案 0 :(得分:2)

就个人而言,我会这样做。我认为财产还可以。如果你认为它是一个VIEW MODEL,那么它有这样的VIEW LOGIC,不是吗?它肯定比用标记交织的意大利面条代码块更好(我不喜欢这些,但有时候没有运行)。

该属性是只读的,用于输出视图特别需要的结果。我的投票是 - 是的,去吧。

答案 1 :(得分:0)

我认为这是一个非常糟糕的代码。因为视图数据是单视图页面的数据模型。所以,你不应该在这里写一些逻辑。它应该写在控制器类中。

顺便说一下,如果从很多视图页面调用这个视图数据,我建议你将源代码初始化为视图数据类的构造函数。

<强>更新

请使用以下模式。调用时不要计算值。因为它可能会影响您的表现。而且,它比get-only属性更喜欢方法模式。

public class SomeViewModel
{
    public SomeViewModel()
    {
        // Initial value of all fields and property
    }

    public IEumerable<string> SomeProperty { get; protected/private set; }
}