2009-07-18 42 views
1

只是一些体系结构问题:我使用ASP.net MVC并完全依赖强类型视图和视图模型类。在ASP.net中查看特定的格式代码MVC

由于演示是查看的工作,这些课程不仅包含某些领域,但也有一些格式化功能,例如,

// 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)?

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

回答

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问题,像你这样的提示,我会definatly不是为每个视图创建单独的ViewModels。你可以为RSS日期格式创建一个单独的扩展方法(这可能会消除对ViewModel中的PostingDateFormat设置的需求?)。

HTHS,
查尔斯

+0

只需添加到这一点:我已经把实际的格式提供和日期格式到web.config文件和访问它通过中央设置级。这样,Html Helper实际上只是格式化它,而不关心实际的格式。 http://www.stum.de/2009/12/28/having-a-nested-configuration-section-in-web-config/ – 2010-01-01 23:22:04