从域模型转换为View模型时发生空引用问题

时间:2017-07-18 10:08:31

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

当没有要从存储过程返回的数据时,以下代码抛出空引用异常。如果存在数据,则方法成功执行。

我在下面的代码中做错了吗?我是否需要从模型中创建对象?

public PersonVM GetStaff()
{
    PersonDM personDM = _Repo.GetStaff();
    PersonVM personVM = PersonVM.ToViewModel(personDM);
    return personVM;
}

public class PersonDM
{
    public int RoleID { get; set; }
    public string Name { get; set; }
}

public class PersonVM
{
    public int RoleID { get; set; }
    public string Name { get; set; }

    public static PersonVM ToViewModel(PersonDM model)
    {
        return new PersonVM
        {
            RoleID = model.RoleID,
            Name = model.Name
        };
    }

    public PersonDM ToEntityModel()
    {
        return new PersonDM
        {
            RoleID=this.=RoleID,
            Name = this.Name,
        }
    }
}

当没有要从SP返回的数据personDM变为NULL时。我需要它填充空值而不返回NULL。有可能实现吗?

Image

我使用以下代码返回List<PersonVM>的方法做了同样的事情。如果没有数据,它将使用NULL值填充VM。如何将以下代码应用于返回类型PersonVM

的方法
public List<PersonVM> GetPartyByPartyRelationship(int partyRoleId, int partyRelationshipTypeId)
    {
        List<PersonDM> personDMList = _partyManagerRepo.GetPartyByPartyRelationship(partyRoleId, partyRelationshipTypeId);
        List<PersonVM> personVMList = new List<PersonVM>();
        foreach (PersonDM personDM in personDMList)
        {
            personVMList.Add(PersonVM.ToViewModel(personDM));
        }

        return personVMList;
    }

1 个答案:

答案 0 :(得分:1)

假设_Repo.GetStaff()返回null并且因此personDM为空,当您尝试访问NullReferenceException内的对象属性时,引发ToViewModel()并不奇怪。 {1}}在空引用上。

GetStaff()ToViewModel()中添加空检查并进行适当处理。根据您的更新,您说您要返回一个具有null属性的viewmodel,您可以使用null检查:

public static PersonVM ToViewModel(PersonDM model)
{
    if (model == null)
        return new PersonVM();

    return new PersonVM
    {
        RoleID = model.RoleID,
        Name = model.Name
    };
}

更新 - 或者,更改ToViewModel()方法以使用null-progagating运算符:

public static PersonVM ToViewModel(PersonDM model)
{
    return new PersonVM
    {
        RoleID = model?.RoleID,
        Name = model?.Name
    };
}