我有一个包含条件逻辑的视图,用于根据模型中的条件在主视图中呈现部分视图。最初我在主页面视图模型中包含了局部视图所需的属性,而且所有内容都是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;因此,对于“只有一个属性的类”等等,并且找不到只有一个属性的类的示例。所以我的问题是:
答案 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)
我个人的偏好不是这样做的。原因很简单,你可以错误地将任何字符串传递给该视图,并且视图会被编译。为每个部分设置专用的视图模型可以降低发生这种情况的可能性。
有没有更好的方法来做我想做的事情,我忽略了?
你可能会争辩说你正在做的事情对于较小的项目来说是过度的,但是,和你一样,我更喜欢我的观点是强类型的。部分是可以重复使用的,对我而言,这意味着它们应该是自给自足的。
实际上,我们也应该在这里谈论验证。您可以通过两种方式查看它:
在我看来,第一个理想的是一切都应该如何。这意味着验证规则将应用于特定部分的专用视图模型。
但是,我们都遇到过验证要求发生变化的情况。这可能是不可取的,但期望验证要求改变部分可能也是不合理的。在这种情况下,为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中具有不同的验证要求,则可以认为它不代表相同的视图。