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

C# ASP.net MVC部分视图表单需要父模型的属性,c#,asp.net,asp.net-mvc,viewmodel,C#,Asp.net,Asp.net Mvc,Viewmodel,我试图以这样一种方式构造我的控制器和视图,即我的所有视图都是强类型的,并且我不使用ViewBag。我有一个从中继承的基本视图模型,为每个视图创建一个“容器”视图模型,并为每个表单创建一个视图模型 在本例中,让我们关注一个区域实体,它可以由一组国家组成(可能用于计算运费、增值税等): 公共类BaseViewModel { 公共字符串标题{get;set;} 公共字符串元描述{get;set;} 公共字符串CanonicalUrl{get;set;} 公共网站网站{get;set;}//类,该类包含

我试图以这样一种方式构造我的控制器和视图,即我的所有视图都是强类型的,并且我不使用ViewBag。我有一个从中继承的基本视图模型,为每个视图创建一个“容器”视图模型,并为每个表单创建一个视图模型

在本例中,让我们关注一个区域实体,它可以由一组国家组成(可能用于计算运费、增值税等):

公共类BaseViewModel
{
公共字符串标题{get;set;}
公共字符串元描述{get;set;}
公共字符串CanonicalUrl{get;set;}
公共网站网站{get;set;}//类,该类包含站点名称、基本url、使用ssl等属性
}
公共类分区创建窗体
{
[关键]
公共int Id{get;set;}
[必需]
公共字符串名称{get;set;}
[数据类型(DataType.multilitext)]
公共字符串说明{get;set;}
public int[]countryId{get;set;}//选定的国家ID
}
公共类ZoneCreateViewModel:BaseViewModel
{
public IEnumerable Countries{get;set;}//所有国家/地区。用于创建要从中选择的下拉列表
公共区域创建窗体创建窗体{get;set;}
}
我试图将我的“表单模型”限制为仅发布到表单的字段。这有助于通过消除基本模型中的属性和post上控制器操作中的AutoMapper来搭建脚手架

但是,在本例中,我需要访问父模型的
Countries
属性,以便创建所有国家/地区的下拉列表

在我看来,我有一些选择:

  • 放弃并将国家/地区填充到ViewBag中,以便可以从CreateForm局部视图访问这些国家/地区
  • 将国家/地区作为
    区域创建表单的一部分
    视图模型,并在控制器操作上使用[Bind(Exclude=“Countries”)]以避免过度过账
  • 还有什么我没想到的

  • 有“标准”的处理方法吗?我在web上看到的大多数示例都使用域模型,而不是带有任何继承和子模型的视图特定模型。每当他们有额外的数据需要时,他们就把它塞进ViewBag,这对我来说很脏。

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

    例如:


    我正在使用MVC5:(关于在MVC6中注入的文章非常有趣。我不知道。他从我描述的确切问题开始。但我感觉它正在将控制器问题泄漏到视图中。为什么你不能在控制器中填充作为ZoneCreateViewModel一部分的Countries属性,并从它在视图上是需要的,在那些不需要的视图上保留为空?需要国家的表单部分视图基于
    区域创建表单
    ,该表单不包括国家列表。我想我最终要做的是将
    IEnumerable countries
    IEnumerable State
    添加到
    区域创建表单中orm
    建模并使用
    公共操作结果创建([Bind(Exclude=“Countries,States”)]ZoneCreateForm)
    作为操作方法。
    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; }
    }