我已经阅读了Jimmy Bogards的帖子,回过头来看看他们如何查看模型,在我自己的项目中,我遇到了一些需要在一个地方展示的信息很多的地方屏幕上的时间,例如需要填写的表格,一次显示所有字段。
所以我们的视图模型看起来像
public class FormViewModel
{
public string field1 {get;set;}
public int field2 {get;set;}
public DateTime field3 {get;set;}
public string field4 {get;set;}
...snip
public string field50 {get;set;}
}
现在表单确实有部分,所以我们可以在viewmodels中引入一些结构,如下所示:
public class FormViewModelSection1
{
public string field1 {get;set;}
public int field2 {get;set;}
}
public class FormViewModelSection2
{
public DateTime field3 {get;set;}
public string field4 {get;set;}
}
然后主视图模型变为
public class FormViewModel
{
public FormViewModelSection1 {get;set;}
public FormViewModelSection2 {get;set;}
}
因此我们将更复杂的viewmodel返回到主视图,该视图基本上只是委托每个部分通过renderpartial呈现,如
<div>
My form
<%: Html.RenderPartial("soemascx", Model.FormViewModelSection1)%>
</div>
或者可以使用编辑器来呈现内容。
我的问题是,视图模型的“重构”是一个有效的事情,还是取消了使视图模型如此平坦所带来的一些好处。
答案 0 :(得分:1)
我说你的问题没有正确答案。这完全取决于可用性和功能。甚至可能是个人编码风格。 意思是长期是
认为这是一个很好的解决方案。如果你问我要做什么:我会选择一个装饰精良的平面类(数据注释)进行名称和验证,以及支持视觉表现的结构(如组合框列表,枚举(或任何你喜欢的) )用于单选按钮。
作为一个注释,我对视图模型的层次结构(继承)有一些不好的经验 - 在验证方面效果很差(继承的数据注释在视图模型继承时不能正常工作)。
所以回答你的具体问题 - 不,你没有做错任何事......由你来决定如何去做。
希望这有帮助。
答案 1 :(得分:0)
我个人不会将我的ViewModel分离为子ViewModels,除非它类似于“UserControl”类型的东西,例如网页侧面的小表单将是一个单独的ViewModel,主页面ViewModel将引用它。
但一般来说,我有一个BaseViewModel,它是一个包含所有共享字段(如pagetitle等)的抽象类,然后我有一个ViewModel用于继承BaseViewModel的View本身。例如:
public abstract class BaseViewModel
{
public string PageTitle { get; set; }
public string MetaDescription { get; set; }
public string MetaKeywords { get; set; }
}
我可能会在我的一些页面中使用一个小注册表单。所以我将为这个小表单创建一个单独的ViewModel。将其分解为自己的对象的一个好处是,当用户提交表单时,我可以传入特定的SignupViewModel对象而不是主页面及其所有实体。
public sealed class SignupViewModel
{
[Required]
public string YourName { get; set; }
[Required]
public string YourEmail { get; set; }
}
然后是一个带有上述用户控件的基本网页:
public sealed class PageViewModel : BaseViewModel
{
public string PageID { get; set; }
public string PageContents { get; set; }
public SignupViewModel UserSignupForm { get; set; }
}
我认为有很多不同的方法可以解决同样的问题,但上面就是我的做法。