显示具有大量属性的View模型

时间:2012-09-11 00:50:06

标签: asp.net-mvc viewmodel renderpartial

我已经阅读了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>

或者可以使用编辑器来呈现内容。

我的问题是,视图模型的“重构”是一个有效的事情,还是取消了使视图模型如此平坦所带来的一些好处。

2 个答案:

答案 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; }
}

我认为有很多不同的方法可以解决同样的问题,但上面就是我的做法。