ASP.net MVC中的视图特定格式代码

时间:2009-07-18 22:51:43

标签: .net asp.net-mvc architecture

只是一些架构问题:我使用ASP.net MVC并且完全依赖于具有视图模型类的强类型视图。

由于表示是View的工作,因此这些类不仅包含一些字段,还包含一些格式化函数,例如,

// The ViewModel contains a List<Comment> which the view.aspx iterates
// through, calling this function in a foreach-loop
// PostingDateFormat and DesiredCulture are fields set by the controller,
// and I don't know if they should be
public string GetCommentDateLine(Comment c)
{
    return c.CommentDate.ToString(this.PostingDateFormat, this.DesiredCulture);
}

我只是想知道这是否正确,或者我是否应该把它移到其他地方?这尤其是多视图使用的函数的关注点。他们应该住在等级以外的特殊班级吗?或者将其复制/粘贴(yikes)到每个View Model Class中?

这也是因为我可能在同一个ViewModel上有多个视图:浏览器的普通视图,另一个RSS阅读器视图。当然,控制器应仅使用Data填充视图模型,并且视图本身应根据目标介质格式化数据(即RSS源中的日期的格式与普通网站上的日期不同)。我应该为Normal和RSS分别使用ViewModel吗?或者控制器应该知道我想要一个RSS字段并使用不同的值填充“PostingDateFormat”字段?这似乎是更好的解决方案(不需要为每个视图复制ViewModel),但我不确定Controller的工作是否知道View需要哪个DateFormat。

1 个答案:

答案 0 :(得分:2)

我建议将所有视图格式化逻辑放入HtmlHelper扩展方法中。通过这种方式,您的视图模型将不包含任何格式化逻辑,并且只执行它们要执行的操作 - 从视图中的控制器传送对象。

所以在你的情况下,我猜你会创造一些东西:

namespace System.Web.Mvc
{
    public static class HtmlExtensions
    {
        public static string CommentDateLine(this HtmlHelper html,
                                             Comment comment,
                                             string format,
                                             IFormatProvider formatProvider)
        {
            return comment.CommentDate.ToString(format, formatProvider);
        }
    }
}

至于PostingDateFormat问题,就像你提示的那样,我绝对不会为每个视图创建单独的ViewModel。您可以为RSS日期格式化创建一个单独的扩展方法(这可能会消除对ViewModel中PostingDateFormat集的需求吗?)。

HTHS,
查尔斯