抽象UI数据格式

时间:2008-12-10 11:49:11

标签: c# asp.net user-interface design-patterns

我有一些具有十进制属性的实体。这些实体的属性显示在我的UI中的多个位置。

目前我发现自己在做:

litWeight.Text = person.Weight.ToString("0.00");
到处都是。 现在我知道一个事实,在几个例子中,并且我怀疑许多其他人,客户可能想要3dh的值。在将来。

我是否可以使用一些模式来处理此Weight属性的格式(以及其他属性;不仅仅是小数,也许是日期等),以便我可以在一个地方进行此格式化?

我知道可以在webconfig中使用formatstring,或者在UI中编写一些扩展方法,但这些方法看起来并不是很优雅。

有一些与我的实体绑定的格式化对象会很好,因此它本身就很明显可以使用哪种格式化程序。

谢谢,

安德鲁

3 个答案:

答案 0 :(得分:2)

最简单的解决方案是使用静态方法创建一个实用程序类,该方法可以适当地格式化不同类型的值并调用它们。例如:

litWeight.Text = Utility.FormatWeight(person.Weight);

答案 1 :(得分:1)

您是否可以向实体添加方法以格式化主题?然后,每个对象都可以委托“策略”对象进行实际格式化。

这样做的原因是既可以更改小数位等,也可以允许国际化等内容 - 小数格式取决于语言环境;有些国家/地区使用十进制逗号代替点数,或者使用三角以外的数字组等数字。

编辑:评论是将表示代码放在域层中。是的,所以对所有设计问题应用标准修复;再添加一层间接:)

您可能不希望拥有完整的MVC,但View和Model的概念似乎仍然合适。也许,对于每个实体,定义一个View类,所以PersonView保持对Person对象的引用,并且对于感兴趣的Person的每个属性都有名为format_weight等的属性?它应该仍然使用策略模式进行实际格式化。

所以你的例子就是

PersonView pv = new PersonView(person)

litWeight.Text = pv.format_weight();

(请原谅语法错误,我不会说C#)

如果需要,可以通过重新实现方法/属性并将其引用到引用的Person,或者通过在创建PersonView时继承Person来使PersonView替换为Person;

答案 2 :(得分:1)

你可以创建一个非常基本的用户控件 - 从标签或类似的东西派生 - 它完全负责显示一个权重字符串,然后你有:

weightValue.DisplayValue(person.Weight);

并且setter根据需要格式化小数。如果在显示重量时使用此选项,则只需更改用户控件即可更改所有重量显示。

基本版可能是:

public void DisplayValue(decimal weight)
{
    this.Text = weight.ToString("0.00");
}