只是一些架构问题:我使用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。
答案 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,
查尔斯