Asp.net mvc 使用从另一个类继承的ViewModel的局部视图不';行不通

Asp.net mvc 使用从另一个类继承的ViewModel的局部视图不';行不通,asp.net-mvc,inheritance,viewmodel,partial-views,Asp.net Mvc,Inheritance,Viewmodel,Partial Views,我有一个视图模型,用于在同一页面上显示多个表单的视图。此视图模型包含将呈现的每个表单的“子视图模型”。每种形式都有自己的局部视图 所有这些表单都共享一组属性(联系信息),但每个表单都有一组不同的附加属性。因此,我认为从基类继承每个表单类是有意义的。然而,当我试图访问url时,我得到了以下错误 传递到字典中的模型项的类型为 “MyProject.ViewModels.JobForm”,但这本字典 需要类型为的模型项 “MyProject.ViewModels.NightShiftForm” 主视图

我有一个视图模型,用于在同一页面上显示多个表单的视图。此视图模型包含将呈现的每个表单的“子视图模型”。每种形式都有自己的局部视图

所有这些表单都共享一组属性(联系信息),但每个表单都有一组不同的附加属性。因此,我认为从基类继承每个表单类是有意义的。然而,当我试图访问url时,我得到了以下错误

传递到字典中的模型项的类型为 “MyProject.ViewModels.JobForm”,但这本字典 需要类型为的模型项 “MyProject.ViewModels.NightShiftForm”

主视图

<%@ Control Language="C#"
  Inherits="ViewUserControl<MyProject.ViewModels.JobsViewModel>" %>

<%: Html.Partial("_NightShiftForm", Model.NightShiftForm) %>
<%: Html.Partial("_DayShiftForm", Model.DayShiftForm) %>

有人知道为什么会发生这种情况吗?

事实证明,当您将空值作为模型参数传递给
Html.RenderPartial
时,MVC很难做到这一点。我的修复程序如下所示:

public class JobsViewModel {
  public NightShiftForm NightShiftForm { get; set; }
  public DayShiftForm DayShiftForm { get; set; }

  public JobsViewModel() {
    NightShiftForm = new NightShiftForm();
    DayShiftForm = new DayShiftForm();
  }
}

我怀疑您的
JobsViewModel
中的两个属性属于
JobForm
类型,而不是您在这里的问题
NightShiftForm
DayShiftForm
中所显示的属性。你在问题中所展示的应该很好。是的。。。在将空模型传递给RenderPartial()时,我也遇到了问题。。。MVC似乎在寻找父对象的类型。这确实是这里的解决方案-确保模型(或子模型)已实例化。
public class JobsViewModel {
  public NightShiftForm NightShiftForm { get; set; }
  public DayShiftForm DayShiftForm { get; set; }
}

public class JobForm {
  public string FirstName { get; set; }
  public string LastName { get; set; }
}

public class DayShiftForm : JobForm {
  public string PreferredCoffeeBrand { get; set; }
  public bool IsMorningPerson { get; set; }
}

public class NightShiftForm : JobForm {
  public string PreferredLocation { get; set; }
  public string PreferredNights { get; set; }
}
public class JobsViewModel {
  public NightShiftForm NightShiftForm { get; set; }
  public DayShiftForm DayShiftForm { get; set; }

  public JobsViewModel() {
    NightShiftForm = new NightShiftForm();
    DayShiftForm = new DayShiftForm();
  }
}