只有一个属性的模型类

时间:2014-01-15 18:12:18

标签: asp.net-mvc partial-views strongly-typed-view

我有一个包含条件逻辑的视图,用于根据模型中的条件在主视图中呈现部分视图。最初我在主页面视图模型中包含了局部视图所需的属性,而且所有内容都是hunky dory。我只是创建了局部视图并让它继承了与主页面相同的视图模型,如下所示:

public class SomeViewModel
{
    public int SomeProperty {get; set;}
    public string SomeOtherProperty { get; set; }
    etc ...
    public string PartialViewProperty { get; set; }
}

然后在局部视图中:

Inherits="System.Web.Mvc.ViewUserControl<SomeViewModel>"

但是现在我想在具有不同视图模型的页面上重用部分视图,因此部分视图不能再继承与父视图相同的视图模型,因为父视图模型将是不同的。我想为部分视图创建一个单独的模型,并在父视图中包含它,但在很多情况下,部分视图中只需要一个属性。我可以通过ViewBag或其他东西传递属性,但我更喜欢我的所有视图都是强类型的。如果我为部分视图创建单独的模型,我的模型现在将如下所示:

public class SomeViewModel
{
    public int SomeProperty {get; set;}
    public string SomeOtherProperty { get; set; }    
    public SomePartialViewModel SomeModelObject { get; set; }
}

public class SomePartialViewModel
{
    public string PartialViewProperty { get; set; }
}

我确信这会奏效,但感觉不对。看到一个只有一个属性的类对我来说很奇怪。我搜索了Google&amp;因此,对于“只有一个属性的类”等等,并且找不到只有一个属性的类的示例。所以我的问题是:

  1. 单个属性类是否正常,我只是没有找到任何示例?
  2. 有什么更好的方法可以做我想做的事情吗?

2 个答案:

答案 0 :(得分:1)

他们不是真正的课程。它们只是低视图模型。不要让他们的异常外表吓到你。

严肃地说,你所描述的,部分人拥有自己的模特,正是我所做的。是的,有些人(和FXCop)可能会因此而对你有所帮助,但正如你在帖子中描述的那样,它更干净,更具可扩展性。

答案 1 :(得分:1)

  

单个属性类是否正常,我只是没有找到任何示例?

我没有看到任何错误,我知道我自己也用过某些东西。部分本身仍然是您的主视图的不同视图,因此基本上,单个属性类确实表示部分为了呈现而需要的所有内容。

话虽如此,您可以强烈地键入部分属性的相关属性。例如,上面的代码:

public class SomeViewModel
{
    public int SomeProperty {get; set;}
    public string SomeOtherProperty { get; set; }    
    public SomePartialViewModel SomeModelObject { get; set; }
}

public class SomePartialViewModel
{
    public string PartialViewProperty { get; set; }
}

不是将视图强加于SomePartialViewModel,而是强烈键入string。这样,您的父视图模型可以简化为:

public class SomeViewModel
{
    public int SomeProperty {get; set;}
    public string SomeOtherProperty { get; set; }
    etc ...
    public string PartialViewProperty { get; set; }
}

现在你可以将字符串传递给partial:

@Html.Partial("SomeView", Model.PartialViewProperty)

我个人的偏好不是这样做的。原因很简单,你可以错误地将任何字符串传递给该视图,并且视图会被编译。为每个部分设置专用的视图模型可以降低发生这种情况的可能性。

  

有没有更好的方法来做我想做的事情,我忽略了?

你可能会争辩说你正在做的事情对于较小的项目来说是过度的,但是,和你一样,我更喜欢我的观点是强类型的。部分是可以重复使用的,对我而言,这意味着它们应该是自给自足的。

修改

实际上,我们也应该在这里谈论验证。您可以通过两种方式查看它:

  1. 部分完全封装以便重复使用,这意味着其验证要求不应更改。
  2. 部分封装传递给它的数据,但根据调用的视图可能有不同的验证要求。
  3. 在我看来,第一个理想的是一切都应该如何。这意味着验证规则将应用于特定部分的专用视图模型。

    但是,我们都遇到过验证要求发生变化的情况。这可能是不可取的,但期望验证要求改变部分可能也是不合理的。在这种情况下,为partial提供专用的视图模型将是一个问题,因为验证规则将适用于该部分视图的所有调用。

    通过将验证应用于父视图模型,您可以更改部分的验证要求。例如:

    public class ViewModelForViewA
    {
        public int Id { get; set; }
        // other properties
    
        [Required]
        public string PartialProperty { get; set; }
    }
    
    public class ViewModelForViewB
    {
        public int Id { get; set; }
        // other properties
    
        // No longer required
        public string PartialProperty { get; set; }
    }
    

    然而,我仍然相信第一种方式是正确的方式。如果部分在视图A和视图B中具有不同的验证要求,则可以认为它不代表相同的视图。