2011-03-29 35 views
0

我正在写一个留言板网页。该页面由Topic项目组成,然后是Response的列表以及添加附加响应的表单。关于构造MVC ViewModel类的建议(父与许多孩子)

我正在努力构建我的页面和viewdata类,使得它们是干净的,并使我能够利用编辑器模板和验证属性。

目前我有一个页面,做到以上,和Im想我的可视数据类最终会是这个样子:

public class TopicViewsData 
    { 
     [ValidateNonEmpty("Please enter some text")] 
     public string Title { get; set; } 

     [ValidateNonEmpty("Please enter some text")] 
     public string TopicBody { get; set; } 

     public IList<TopicResponseViewsData> Responses { get; set; } 

     public TopicResponseViewsData NewResponse { get; set; } 

    } 

    public class TopicResponseViewsData 
    { 
     [ValidateNonEmpty("Please enter some text")] 
     public string ResponseText{ get; set; } 
    } 

我的页面键入一个TopicViewsData,它只是似乎丑陋,我有具有NewResponse属性,以便页面可以访问TopicResponseViewsData上的验证属性。有没有更好的方法来做到这一点?

+0

我不清楚你最后一段吗? – gideon 2011-03-29 18:52:53

回答

0

我认为TopicViewsData模型中的Body属性与NewResponse属性是多余的。

因此,您的观点正在处理响应,每个响应都有一个正文。所以:

public class TopicResponseViewsData 
{ 
    [ValidateNonEmpty("Please enter some text")] 
    public string Body { get; set; } 
} 

到目前为止好。接下来,你说你有一张响应清单显示和一个新的响应增加,因此:

public class TopicViewsData 
{ 
    public IList<TopicResponseViewsData> Responses { get; set; } 
    public TopicResponseViewsData NewResponse { get; set; } 
} 

就目前而言,鉴于你的描述这就是我在视图模型中看到必要的。至少模型反映了您的场景描述。

+0

我想我误导了你。我是否更改属性名称以使其更清晰? – Dan 2011-03-29 19:02:28

+0

@丹,那么你的模型看起来很好。有什么问题? – 2011-03-29 19:04:42

+0

它似乎很丑陋,我必须拥有NewResponse属性,以便页面可以访问TopicResponseViewsData上的验证属性 – Dan 2011-03-29 19:13:56

3

听起来像你正朝着一个庞大而复杂的视角前进,更不用说你已经看到你的模型结构的问题。我没有对你的工作做出权衡,而是对你的整体视图模型设计提出了一些建议。

我倾向于将我的模型分为ViewModelsFormModelsViewModels用于显示数据,而FormModels用于用户输入。这不仅提供了一个明确的功能指定,除了为应用验证逻辑提供一个位置外,它通常还允许我保持输入属性为原语,字符串和日期的属性。虽然在我的ViewModels中,我可以灵活地使用复杂属性类型,而不必担心验证逻辑。

为了让事情更容易,我遵循Jimmy Bogard's建议你应该只有one view per model。通过不混合和匹配模型,我发现我的模型保持专注,我的观点不转化为意大利面条。为了保持整洁,我将模型命名为与控制器和视图相似的模型。我可能会得到一些额外的型号,但是为了更清洁的设计而付出的代价是很小的。