C# 使用提供空异常错误的ViewModel

C# 使用提供空异常错误的ViewModel,c#,asp.net,asp.net-mvc-3,razor,entity-framework-4,C#,Asp.net,Asp.net Mvc 3,Razor,Entity Framework 4,我正在使用此视图模型: public class CaseComplaintsViewModel { public int CasesID { get; set; } public int CaseComplaintID { get; set; } public string ComplaintCode { get; set; } public string ComplaintType { get; set; } } 这是使用视图模型的视图 @model IEn

我正在使用此视图模型:

public class CaseComplaintsViewModel
{
    public int CasesID { get; set; }
    public int CaseComplaintID { get; set; }
    public string ComplaintCode { get; set; }
    public string ComplaintType { get; set; }
}
这是使用视图模型的视图

@model IEnumerable<cummins_db.ViewModels.CaseComplaintsViewModel>

<table width="100%">
    <tr>
        <th></th>
        <th></th>
        <th>Complaint Code</th>
        <th>Complaint Description</th>
        <th>Delete</th>
    </tr>  
    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.HiddenFor(modelItem => item.CasesID )    
            </td>
            <td>
                @Html.HiddenFor(modelItem => item.CaseComplaintID )    
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ComplaintCode )    
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ComplaintType)
            </td>
            <td>
                @Ajax.ActionLink("Delete", "RemoveCodeFromCase", "Cases", new {    caseid           item.CasesID, id = item.CaseComplaintID }, null)
            </td>        
        </tr>
    }
</table>
db.SaveChanges
之后,当我尝试加载ViewModel时,在
ComplaintCode=x.ComplaintCode.ComplaintCodeName

此视图模型旨在返回
案例投诉
和投诉代码模型的视图

代码中的断点显示未加载
投诉代码。我知道我错过了一些东西,但不确定是什么

谢谢

******编辑********* 这是我的案例模型

public class Cases
    {
    //case data model for call center
    //implement lists for all related child tables too

    [Key]
    public int CasesID { get; set; }

    public string CaseNumber { get; set; }

    [Required(ErrorMessage = "Customer is Required")]
    public int CustomerID { get; set; }
    public virtual Customer Customer { get; set; }

    [MaxLength(50)]
    public string UserName { get; set; }  //get user name from the aspnet membership

    [Required(ErrorMessage = "Case Category is Required")]
    public int CaseCategoryID { get; set; }

    public int TechnicianID { get; set; }
    public virtual Technician Technicians { get; set; }

    [Required(ErrorMessage = "Engine Model is Required")]
    public int EngineModelID { get; set; }
    public virtual EngineModel EngineModel { get; set; }

    [MaxLength(50)]
    public string BMSWorkorder { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage = "Status is Required")]
    public string CaseStatus { get; set; }

    [MaxLength(50)]
    public string OpenedBy { get; set; }

    [Required(ErrorMessage = "Opened Date is Required")]
    [DataType(DataType.DateTime)]
    public DateTime? OpenedDate { get; set; }

    [MaxLength(50)]
    public string ClosedBy { get; set; }

    [DataType(DataType.DateTime)]
    public DateTime? ClosedDate { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage="Caller First Name is Required")]
    public string CallerFirstName { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage = "Caller Last Name is Required")]
    public string CallerLastName { get; set; }

    [MaxLength(100)]
    public string AdditionalContact { get; set; }

    [MaxLength(10)]
    [Required(ErrorMessage = "Qualified is Required")]
    public string Qualified { get; set; }

    public string Description { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage = "ESN is Required")]
    public string ESN { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage = "Mileage is Required")]
    public string Mileage { get; set; }

    [DataType(DataType.Date)]
    public DateTime? DateInService { get; set; }

    [MaxLength(50)]
    public string ESTR { get; set; }

    [MaxLength(50)]
    public string EDS { get; set; }

    [MaxLength(50)]
    public string GensetSerialNumber { get; set; }

    [MaxLength(50)]
    public string GensetModelNumber { get; set; }

    //child Case Notes records
    public virtual ICollection<CaseNotes> CaseNotes { get; set; }

    //child case attachment records
    public virtual ICollection<Attachment> Attachments { get; set; }

    //child case complaint records
    public virtual ICollection<CaseComplaint> CaseComplaint { get; set; }

    //tracking fields
    public DateTime? CreatedOn { get; set; }
    [MaxLength(50)]
    public string CreatedBy { get; set; }
    public DateTime? ModifiedOn { get; set; }
    [MaxLength(50)]
    public string ModifiedBy { get; set; }
    }
这是我的抱怨代码模型

public class ComplaintCode
        {
        public int ComplaintCodeID { get; set; }

        [MaxLength(50)]
        [Required(ErrorMessage="Complaint Code is required")]
        public string ComplaintCodeName { get; set; }

        [MaxLength(50)]
        [Required(ErrorMessage="Complaint Type is required")]
        public string ComplaintType { get; set; }

        public virtual ICollection<CaseComplaint> CaseComplaint { get; set; }

        }
公共类投诉代码
{
公共int ComplaintCodeID{get;set;}
[MaxLength(50)]
[必需(ErrorMessage=“需要投诉代码”)]
公共字符串ComplaintCodeName{get;set;}
[MaxLength(50)]
[必需(ErrorMessage=“需要投诉类型”)]
公共字符串投诉类型{get;set;}
公共虚拟ICollection案例投诉{get;set;}
}

来自数据上下文的数据有问题。使用Visual studio断点,选中db.caseCompulations.ToList()
,查看每个项都有一个有效的不为null的ComplaintCode属性。

插入的实体将用于以后的选择,并且无法加载其导航属性。这仅适用于从数据库加载的实体。如果您处理了对象上下文并创建了一个新的上下文,您就可以使用它。或者您可以尝试以下选择:

var data = (from C in db.CaseComplaints
            where C.CasesID == caseid
            select new CaseComplaintsViewModel()
                    {
                        CasesID = C.CasesID,
                        CaseComplaintID = C.ComplaintCodeID,
                        ComplaintCode = C.ComplaintCode.ComplaintCodeName,
                        ComplaintType = C.ComplaintCode.ComplaintType
                    }).ToList();

还有一些选项可以从数据库中刷新实体,但不确定是否有效,但这是一个您不需要的另一个db查询。这没有任何作用。

这个问题与ASP.NET MVC无关。这是您的数据,并通过EF进行检索。很明显,
ComplaintCode
属性为空。您是否验证了您的数据库包含正确的值?谢谢。db.caseCompulations.ToList()有2项为空。表示Cases模型和ComplaintCode模型的属性显示您的模型类看起来像什么?我添加了与问题相关的模型类,只是知道它可以工作,因为它必须为您想要的属性构造一个新的SQL查询,而不依赖任何类型的实体可以加载到内存中的某个地方。
public class ComplaintCode
        {
        public int ComplaintCodeID { get; set; }

        [MaxLength(50)]
        [Required(ErrorMessage="Complaint Code is required")]
        public string ComplaintCodeName { get; set; }

        [MaxLength(50)]
        [Required(ErrorMessage="Complaint Type is required")]
        public string ComplaintType { get; set; }

        public virtual ICollection<CaseComplaint> CaseComplaint { get; set; }

        }
var data = (from C in db.CaseComplaints
            where C.CasesID == caseid
            select new CaseComplaintsViewModel()
                    {
                        CasesID = C.CasesID,
                        CaseComplaintID = C.ComplaintCodeID,
                        ComplaintCode = C.ComplaintCode.ComplaintCodeName,
                        ComplaintType = C.ComplaintCode.ComplaintType
                    }).ToList();