ASP.net MVC局部视图表单需要父模型的属性

时间:2015-11-06 13:53:19

标签: c# asp.net asp.net-mvc viewmodel

我正在尝试以这样的方式构建我的控制器和视图,以便我的所有视图都是强类型的,而且我没有使用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属性才能创建所有国家/地区的下拉列表。

我看到它的方式,我有一些选择:

  1. 将国家/地区填入ViewBag,以便可以从 CreateForm 部分视图访问这些国家/地区。
  2. 使国家成为ZoneCreateForm视图模型的一部分,并在控制器操作上使用[Bind(Exclude =“Countries”)]以避免过度发布
  3. 我还没想到别的什么?
  4. 是否有“标准”处理方法?我在网上看到的大部分例子都是使用域模型,而不是具有任何继承和子模型的特定于视图的模型。每当他们有额外的数据需求时,他们只需将其填充到ViewBag中,这对我来说似乎很脏。

1 个答案:

答案 0 :(得分:1)

您使用的是什么版本的MVC?使用MVC6,您可以在视图中添加依赖项注入,而不是在模型中使用它。

示例: