1

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

现在表单确实有部分,所以我们可以像这样在视图模型中引入一些结构:

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

因此,我们会将更复杂的视图模型返回到一个主视图,该主视图基本上只是将其每个部分委托出去,以便通过像这样的渲染部分进行渲染

<div>
My form

<%: Html.RenderPartial("soemascx", Model.FormViewModelSection1)%>
</div>

或者也许使用编辑器来呈现内容。

我的问题是,视图模型的“重组”是一件有效的事情,还是它取消了使视图模型如此平坦所提供的一些好处。

4

2 回答 2

1

我会说你的问题没有正确的答案。这一切都取决于可用性和功能。甚至可能是个人编码风格。意思是只要它是

  • 工作(显示、回发、验证等)
  • 服务于目的
  • 其他人可以理解(阅读可维护)

认为这是一个很好的解决方案。如果你问我会做什么:我会使用一个装饰精美的平面类(数据注释)用于名称和验证,以及支持视觉表示的结构(如组合框的列表、枚举(或任何你喜欢的东西) ) 用于单选按钮。

作为说明,我在视图模型的层次结构(继承)方面有一些不好的经验——在验证方面工作得非常糟糕(继承的数据注释在视图模型继承中不能按预期工作)。

所以要回答你的具体问题 - 不,你没有做错任何事......这取决于你如何去做。

希望这可以帮助。

于 2012-09-11T16:51:55.037 回答
0

我个人不会将我的 ViewModel 分成子 ViewModel,除非它是用于类似“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; }
}

我想有很多不同的方法可以解决同一件事,但以上就是我的做法。

于 2012-09-11T01:51:08.137 回答