访问foreach中的if语句中的相关数据

时间:2016-08-13 23:53:40

标签: c# asp.net-mvc entity-framework linq

我有3张桌子。 Vlan,IPNets和设备

Vlans与IPNets有一对多的关系,而且Equipments与IPNets有一对多的关系。

在我对Vlans的详细信息视图中,我有这个foreach。

                    @foreach (var item in Model.IPNets)
                {
                    <tr>
                        <td>
                            @Html.DisplayFor(modelItem => item.Equipment.Description)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.IPAddresse)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.Equipment.Name)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.Equipment.EquipmentTypes.Name)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.Equipment.Departments.Name)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.Equipment.Location)
                        </td>
                        <td>
                          @if (item.Equipment.PacsId == 1)
                            {
                            <small class="label bg-green">PACS</small>
                            }
                }

模型项目工作正常并生成一个表格,其中IPNets中的alle项目与Vlans的关系相匹配。

问题是if语句。因为现在我得到“对象未设置为对象的实例”。

使用item.EquipmentId这是IPNets中的外键正在工作,但不是我想要使用的属性。

使用@if(modelItem =&gt; item.Equipment.PacsId == 1)会出错:无法将lambda表达式转换为'bool'类型,因为它不是委托类型

视图模型

    public class VlansViewModel
{
    public int VlanId { get; set; }

    public string Zone { get; set; }

    public string Number { get; set; }

    public string VlanName { get; set; }

    public string Info { get; set; }

    public string IPNet { get; set; }

    public string IPStart { get; set; }

    public string IPEnd { get; set; }

    public string Mask { get; set; }

    public string Gateway { get; set; }

    public Location? Location { get; set; }

    public string Cidr { get; set; }

    public virtual ICollection<IPNet> IPNets { get; set; }

    public virtual IEnumerable<Equipment> Equipments { get; set; }



    public VlansViewModel(Vlan vlan)
      {
         VlanId = vlan.VlanId;
         Zone = vlan.Zone;
         Number = vlan.Number;
         VlanName = vlan.Name;
         Info = vlan.Info;
         IPNet = vlan.IPNet;
         IPStart = vlan.IPStart;
         IPEnd = vlan.IPEnd;
         Mask = vlan.Mask;
         Gateway = vlan.Gateway;
         Cidr = vlan.Cidr;
         IPNets = vlan.IPNets;
         Location = vlan.Location;
    }


}

控制器

        // GET: Vlans/Details/5
    public ActionResult Details(int? id)
    {
        // Get current Id
        var vlansid = db.Vlans.Find(id);

        //ViewModel
        var ViewModel = new VlansViewModel(vlansid);

        return View("Details", ViewModel);
    }

有关如何在if语句中使用item.Equipment.PacsId的任何建议吗?

更新

正如Shyju指出的那样,当包含if语句时,Equipment属性确实为null。但是,当Vlans与它没有关系时,我只是不明白如何包含该属性。

我想我需要在控制器中进行查询,其中包括EquipId等于IPNets.EquipmentId的设备,但是我已经试图解决这个问题很长时间了,所有事情都开始融合成一个大模糊。< / p>

我也不明白为什么modelItem =&gt; item.Equipment.PacsId正在加载正确的值,但item.Equipment.PacsId为null。我是新手,如果有人能给出简短的解释,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

检查是否为null,如果不为null则继续:

@if (item.Equipment != null && item.Equipment.PacsId == 1)