Asp.net mvc 仅具有一个属性的模型类

Asp.net mvc 仅具有一个属性的模型类,asp.net-mvc,partial-views,strongly-typed-view,Asp.net Mvc,Partial Views,Strongly Typed View,我有一个视图,它包含根据模型中的条件在主视图中渲染局部视图的条件逻辑。最初,我在主页的视图模型中包含了部分视图所需的属性,所有内容都很好。我只是创建了部分视图,并让它继承与主页相同的视图模型,如下所示: public class SomeViewModel { public int SomeProperty {get; set;} public string SomeOtherProperty { get; set; } etc ... public string

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

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>"
我相信这会奏效,但感觉不对。看到一个类中只有一个属性,我觉得很奇怪。我在Google&SO上搜索了“只有一个属性的类”之类的东西,但找不到只有一个属性的类的例子。因此,我的问题是:

  • 单属性类可以吗?我只是碰巧没有找到任何示例
  • 有没有更好的方法来做我想做的事,而我却忽略了

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

    说真的,你们所描述的,各部分都有自己的模型,这正是我所做的。是的,一些人(和FXCop)可能会因为它而抱怨你,但正如你在文章中所描述的,它更干净,更可扩展

    单属性类可以吗?我只是碰巧没有找到任何示例

    我看不出这有什么不对,我知道我自己在某些事情上也用过这个。分部本身仍然是与主视图不同的视图,因此本质上,单个属性类表示分部渲染所需的所有内容

    话虽如此,您只需将partial强类型输入到相关属性的类型中即可。例如,以上面的代码为例:

    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)
    
    我个人不喜欢这样做。原因很简单,您可能会错误地将任何字符串传递给该视图,该视图将被编译。为每个部分提供专用的视图模型可以降低发生这种情况的可能性

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

    你可能会争辩说,你所做的对于较小的项目来说是过分的,但是,像你一样,我更喜欢我的观点是强类型的。分部代码可以重用,对我来说,这意味着它们应该是自给自足的

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

  • 分部代码完全封装以供重用,这意味着其验证需求不应更改
  • 分部封装了传递给它的数据,但根据调用它的视图可能有不同的验证要求
  • 在我看来,第一个问题是理想的一切应该是怎样的。这意味着验证规则将应用于特定部分的专用视图模型

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

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

    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中有不同的验证要求,您可能会争辩说它不代表同一个视图。

    与其使用单个属性类,不如使用属性类型作为您的模型类型。@davidly不确定我是否遵循。你能给我举个例子吗?
    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; }
    }