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