我正在尝试以这样的方式构建我的控制器和视图,以便我的所有视图都是强类型的,而且我没有使用ViewBag。我有一个我继承的基本视图模型,每个视图创建一个“容器”视图模型,以及每个表单的视图模型。
在这个例子中,让我们关注一个可以由一组国家组成的区域实体(可能用于计算运费,增值税等):
public class BaseViewModel
{
public string Title { get; set; }
public string MetaDescription { get; set; }
public string CanonicalUrl { get; set; }
public Website Website { get; set; } // class that contains properties like site name, base url, use ssl, etc
}
public class ZoneCreateForm
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
[DataType(DataType.MultiLineText)]
public string Description { get; set; }
public int[] CountryIds { get; set; } // Selected country ids
}
public class ZoneCreateViewModel : BaseViewModel
{
public IEnumerable<Country> Countries { get; set; } // All countries. Used to create a dropdown list to select from
public ZoneCreateForm CreateForm { get; set; }
}
我试图将我的“表单模型”限制为仅发布到表单的字段。这有助于通过从基本模型中删除属性来帮助构建脚本,并在帖子上的控制器操作中使用AutoMapper。
但是,在此示例中,我需要访问父模型的Countries
属性才能创建所有国家/地区的下拉列表。
我看到它的方式,我有一些选择:
ZoneCreateForm
视图模型的一部分,并在控制器操作上使用[Bind(Exclude =“Countries”)]以避免过度发布是否有“标准”处理方法?我在网上看到的大部分例子都是使用域模型,而不是具有任何继承和子模型的特定于视图的模型。每当他们有额外的数据需求时,他们只需将其填充到ViewBag中,这对我来说似乎很脏。
答案 0 :(得分:1)
您使用的是什么版本的MVC?使用MVC6,您可以在视图中添加依赖项注入,而不是在模型中使用它。
示例: