我正在写一个留言板网页。该页面包含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上的验证属性。有更好的方法吗?
答案 0 :(得分:3)
听起来你正走向一个庞大而复杂的视角,更不用说你已经在模型结构中看到的问题了。我没有做出权衡来制作你的工作,而是对你的整体视图模型设计提出了一些建议。
我倾向于将我的模型分为ViewModels
和FormModels
。 ViewModels
用于显示数据,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; }
}
目前,根据您的描述,我在视图模型中看到了所有必要的内容。至少模型反映了您的场景描述。