2015-09-15 30 views
1

我正在尋找基於另一個表從我的表中選擇一個列表。我需要檢索屬於特定系統系列的系統名稱。我已經添加了外鍵。我創建了一個包含這兩個類的ViewModel,但它引發了空指針異常。我是MVC的新手,我不確定自己錯在哪裏。MVC5:外鍵和數據訪問

模型類:系統 公共類系統 {

public int SystemsID { get; set; } 
    public string SystemName { get; set; } 
    public DateTime CreatedOn { get; set;} 
    public string CreatedBy { get; set; } 
    public int SystemFamilyID { get; set; } 

    public virtual SystemFamily SystemFamily { get; set; } 
} 

類SystemFamily

public class SystemFamily 
{ 

    public int SystemFamilyID { get; set;} 
    public int SystemsID {get;set;} 
    public string FamilyName { get; set; } 
    public DateTime DateCreated { get; set; } 
    public string CreatedBy { get; set; } 

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


} 

ViewSystem是我SystemFamilyController的方法。

public ActionResult ViewSystem(int? id) 
    { 
     var viewmodel = new Sys_SysFam(); 
     ViewBag.SystemFamilyID = id.Value; 
     //if (id != null) 
     //{ 
     // ViewBag.SystemFamilyID = id.Value; 
     // viewmodel.Systems = viewmodel.SystemFamily.Where(
     //  i => i.SystemFamilyID == id.Value).Single().Systems; 
     //} 

     return View(viewmodel); 
    } 

的觀點:

@model SystemFam_System.ViewModel.Sys_SysFam 
@{ 
ViewBag.Title = "ViewSystem"; 
} 

<h2>ViewSystem</h2> 

<p>@ViewBag.SystemFamilyID</p> 
<table> 
@foreach (var item in Model.Systems) 
{ 
    string selectedRow = ""; 
    if (item.SystemFamilyID == ViewBag.SystemFamilyID) 
    { 
     //{ 
     // selectedRow = "success"; 
     //} 

     <tr class="@selectedRow"> 
      <td> 
       @item.SystemName 
      </td> 
      <td> 
       @item.SystemsID 
      </td> 
      <td> 
       @item.SystemFamily 
      </td> 
     </tr> 

     } 
    } 
</table> 

我得到空指針異常。我想查看屬於視圖系統中特定家庭的系統。

在此先感謝! VINI

編輯:

public class Sys_SysFam 
{ 
    public IEnumerable<Systems> Systems { get; set; } 
    public SystemFamily SystemFamily { get; set; } 
} 

回答

1

好吧,我已經檢查Sys_SysFam課呢。按照當前的代碼,它會永遠拋出空引用異常becasue在控制器代碼使用的是:

public ActionResult ViewSystem(int? id) 
    { 
     var viewmodel = new Sys_SysFam(); 
     ViewBag.SystemFamilyID = id.Value; 
     //if (id != null) 
     //{ 
     // ViewBag.SystemFamilyID = id.Value; 
     // viewmodel.Systems = viewmodel.SystemFamily.Where(
     //  i => i.SystemFamilyID == id.Value).Single().Systems; 
     //} 

     return View(viewmodel); 
    } 

這裏要創建Sys_SysFam的對象視圖模型,併爲您如果部分註釋,以便您返回相同viewmodel.System將始終爲null。在這裏,我沒有看到任何數據庫從數據庫獲取數據的請求,但我認爲你的viewmodel數據將來自數據庫,如果我取消註釋你的條件,那麼你也沒有發送任何請求數據庫,你正在使用相同的viewmodel對象創建以上。

viewmodel.Systems = viewmodel.SystemFamily.Where(
        i => i.SystemFamilyID == id.Value).Single().Systems; 
在右側

您使用viewmodel.SystemFamily與那裏的條件,但作爲viewmodel.SystemFamily爲空,它會永遠拋出異常。您的解決方案應該是這樣的:

public ActionResult ViewSystem(int? id) 
     { 
      DataContext context = new DataContext(); 
      var viewmodel = new Sys_SysFam(); 
      ViewBag.SystemFamilyID = id.Value; 
      if (id != null) 
      { 
       ViewBag.SystemFamilyID = id.Value; 
       var sysFamily = context.SystemFamily.Include(x => x.Systems).FirstOrDefault(x => x.SystemFamilyID == id.Value); 
       if (sysFamily != null) 
       { 
        viewmodel.Systems = sysFamily.Systems; 
       } 
      } 

      return View(viewmodel); 
     } 

這裏的DataContext的第一個我創建對象,它是我的主要環境中使用實體框架來訪問數據庫。所以首先我會根據數據庫傳遞的ID來獲取系統族,如果系統族不爲空,那麼我將在viewmodel中設置系統的數據。包含方法將從數據庫爲基於系統系統的系統帶來數據。

還完善了Sys_SysFam類來初始化系統,這樣就不會引發異常在你看來,當存在viewmodel.Systems沒有數據是這樣的:

public class Sys_SysFam 
    { 
     public Sys_SysFam() 
     { 
      this.Systems = new List<Systems>(); 
     } 

     public SystemFamily SystemFamily { get; set; } 

     public IEnumerable<Systems> Systems { get; set; } 
    } 

希望這會幫助你。

+0

感謝您的回答。但我無法解決_DataContext_ – Vini

+0

您是否使用實體框架orm進行數據庫操作或Ado.Net? –

+0

DataContext我用來查詢數據庫獲取數據 –

0
Remove SystemsID property from SystemFamily class because it is not used for ICollection virtual property. so your SystemFamily class should be like this: 

    public class SystemFamily 
{ 

    public int SystemFamilyID { get; set;} 
    public string FamilyName { get; set; } 
    public DateTime DateCreated { get; set; } 
    public string CreatedBy { get; set; } 

    public virtual ICollection<Systems> Systems { get; set; } 
} 
+0

它仍然拋出了同樣的錯誤:空指針異常 – Vini

+0

你可以請更新Sys_SysFam類你的問題太 –

+0

添加類以及.. – Vini

0

我的一個朋友可以找到我一個方法。但它不使用任何ViewModel。我想知道如何使用ViewModel來完成它。

 public ActionResult ViewSystem(int? id) 
     { 

      var model = from item in db.Systems 
         orderby item.SystemsID 
         where item.SystemFamilyID == id 
         select item; 
      return View(model); 
     }