关于构造MVC ViewModel类的建议(包含许多子节点的父类)

时间:2011-03-29 18:45:44

标签: asp.net-mvc

我正在写一个留言板网页。该页面包含Topic项,然后是Response列表和添加其他响应的表单。

我正在努力构建我的页面和viewdata类,以便它们干净并允许我利用编辑器模板和验证属性。

目前我有一个页面可以完成以上所有操作,我认为我的viewdata类最终会看起来像这样:

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上的验证属性。有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分: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; }
}

目前,根据您的描述,我在视图模型中看到了所有必要的内容。至少模型反映了您的场景描述。