2014-10-02 76 views
-2

「對象引用未設置爲對象的實例」在我的方法中,我有多個過濾數據和返回對象的語句。因爲我想用視圖模型服務視圖,我實例化一個列表,然後將其傳遞到視圖中...對於列表<T>。「添加

簡化示例。

List<viewModel> returnedViewModel = new List<viewModel>(); 

    foreach (var item in filteredData) 
    { 
     returnedViewModel.Add(// this line is throwing error 
     new viewModel 
     { 
      data = item, 
     }); 
    } 

問題是我得到「對象引用未設置爲對象的實例」。爲其中一個特定的filteredData對象返回了viewModel.Add,而其他則不會導致該問題。

我是在解決了這個問題的可能來源之後。

我使用EF並在我的connectionString中有一個MARS語句。這可能是一個問題嗎?

全statment:

public ActionResult RenderPartialSearchableEventStacks(string viewType, 
                 string orderColumn, 
                 string sortOrder, 
                 int? stackNumber, 
                 string adminName, 
                 string clientName, 
                 string stackType, 
                 string stackStatus, 
                 int? adminId = null) 
{ 
    IEnumerable<blsEventStack> eventStacks = unitOfWork.EventStackRepository.Filter(n => (stackNumber == null) || n.EventStackId == stackNumber, 
                        n => (String.IsNullOrEmpty(adminName)) || n.ManagingAdminName.Contains(adminName), 
                        n => (String.IsNullOrEmpty(clientName)) || n.RelatedClientName.Contains(clientName), 
                        n => (String.IsNullOrEmpty(stackType)) || n.EventStackType.Contains(stackType), 
                        n => (String.IsNullOrEmpty(stackStatus)) || n.EventStackLastEventStatus.Contains(stackStatus)); 

    IEnumerable<blsEventStack> viewTypeRelatedEventStacks = eventStacks; 

    if (viewType == "allEventStacks") 
    { 
     viewTypeRelatedEventStacks = unitOfWork.EventStackRepository.GetAll(); 
    } 

    if (viewType == "assignedEventStacks") 
    { 
     // Needed to filter out results with empty (unassigned) admin name 
     viewTypeRelatedEventStacks = from x in eventStacks 
            where x.ManagingAdminName != null 
            select x; 
    } 

    if (viewType == "singleAdminAssignedEventStacks") 
    { 
     string singleAdminName; 

     if (adminId != null) 
     { 
      // Gets admin name using adminId 
      singleAdminName = unitOfWork.AdminRepository.GetById(adminId).AdminName; 
     } 
     else 
     { 
      MembershipUser admin = Membership.GetUser(); 

      blsAdmin loggedInAdmin = (from x in unitOfWork.AdminRepository.GetAll() 
             where x.AdminEmail == admin.Email 
             select x).FirstOrDefault(); 

      singleAdminName = loggedInAdmin.AdminName; 

      ViewBag.adminView = true; 
     } 

     // Gets all eventStacks that belong to a give adminName 
     viewTypeRelatedEventStacks = from x in eventStacks 
            where x.ManagingAdminName == singleAdminName 
            select x; 

     ViewBag.adminId = adminId; 
    } 

    IEnumerable<blsEventStack> returnedEventStacks = viewTypeRelatedEventStacks; 

    if (orderColumn == "stack") 
    { 
     if (sortOrder == "descendingStack") 
     { 
      returnedEventStacks = from x in viewTypeRelatedEventStacks 
            orderby x.EventStackId descending 
            select x; 
      sortOrder = null; 
     } 
     else 
     { 
      returnedEventStacks = from x in viewTypeRelatedEventStacks 
            select x; 
      sortOrder = "descendingStack"; 
     } 
    } 

    if (orderColumn == "managingAdmin") 
    { 
     if (sortOrder == "descendingManagingAdmin") 
     { 
      returnedEventStacks = from x in viewTypeRelatedEventStacks 
            orderby x.ManagingAdminName descending 
            select x; 
      sortOrder = null; 
     } 
     else 
     { 
      returnedEventStacks = from x in viewTypeRelatedEventStacks 
            orderby x.ManagingAdminName 
            select x; 
      sortOrder = "descendingManagingAdmin"; 
     } 
    } 

    if (orderColumn == "relatedClient") 
    { 
     if (sortOrder == "descendingRelatedClient") 
     { 
      returnedEventStacks = from x in viewTypeRelatedEventStacks 
            orderby x.RelatedClientName descending 
            select x; 
      sortOrder = null; 
     } 
     else 
     { 
      returnedEventStacks = from x in viewTypeRelatedEventStacks 
            orderby x.RelatedClientName 
            select x; 
      sortOrder = "descendingRelatedClient"; 
     } 
    } 

    if (orderColumn == "stackType") 
    { 
     if (sortOrder == "descendingStackType") 
     { 
      returnedEventStacks = from x in viewTypeRelatedEventStacks 
            orderby x.EventStackType descending 
            select x; 
      sortOrder = null; 
     } 
     else 
     { 
      returnedEventStacks = from x in viewTypeRelatedEventStacks 
            orderby x.EventStackType 
            select x; 
      sortOrder = "descendingStackType"; 
     } 
    } 

    if (orderColumn == "latestEventTime") 
    { 
     if (sortOrder == "descendingLatestEventTime") 
     { 
      returnedEventStacks = from x in viewTypeRelatedEventStacks 
            orderby x.EventStackLastEventTime descending 
            select x; 
      sortOrder = null; 
     } 
     else 
     { 
      returnedEventStacks = from x in viewTypeRelatedEventStacks 
            orderby x.EventStackLastEventTime 
            select x; 
      sortOrder = "descendingLatestEventTime"; 
     } 
    } 

    if (orderColumn == "latestEventStatus") 
    { 
     if (sortOrder == "descendingLatestEventStatus") 
     { 
      returnedEventStacks = from x in viewTypeRelatedEventStacks 
            orderby x.EventStackLastEventStatus descending 
            select x; 
      sortOrder = null; 
     } 
     else 
     { 
      returnedEventStacks = from x in viewTypeRelatedEventStacks 
            orderby x.EventStackLastEventStatus 
            select x; 
      sortOrder = "descendingLatestEventStatus"; 
     } 
    } 

    List<ViewModelAllEventStacks> returnedViewModel = new List<ViewModelAllEventStacks>(); 

    foreach (var item in returnedEventStacks) 
    { 
     returnedViewModel.Add( 
     new ViewModelAllEventStacks 
     { 
      EventStack = item, 
      AdminId = item.AdminEventLogs.FirstOrDefault().AdminId, 
      ClientId = item.ClientEventLogs.FirstOrDefault().ClientId 
     }); 
    } 

    ViewBag.stackNumber = stackNumber; 
    ViewBag.adminName = adminName; 
    ViewBag.clientName = clientName; 
    ViewBag.stackType = stackType; 
    ViewBag.stackStatus = stackStatus; 

    // ViewBag passing state of existing order 
    ViewBag.sortOrder = sortOrder; 

    // ViewBag passing view data (ex. assignedEventStacks, allEventStacks, etc.) 
    ViewBag.viewType = viewType; 

    return PartialView("BLS_AllEventStacks", returnedViewModel); 
} 
+1

在運行時,*其中*對象實際上是'null'? – David 2014-10-02 12:34:44

+1

您應該嘗試並投射它,並查看'item'是否已初始化。 什麼是「數據」?我們只看到了一小部分難題。 – 2014-10-02 12:35:17

+3

是'viewModel'(urgh-請使用常規類型名稱)構造函數拋出異常嗎?也許分配給'data'屬性/字段?將'viewModel'的構建從列表中添加到列表中... – 2014-10-02 12:35:25

回答

2

有4個可能的原因:

  1. 你在調試代碼是不是出了什麼實際運行和已過時。
  2. 構造函數viewModel中存在空例外。
  3. data屬性中發生空例外情況。
  4. 正如評論中指出的那樣,有一些代碼被過濾出來,實際上是將列表設置爲null

基於編輯的問題

returnedViewModel.Add( 
    new ViewModelAllEventStacks 
    { 
     EventStack = item, 
     AdminId = item.AdminEventLogs.FirstOrDefault().AdminId, 
     ClientId = item.ClientEventLogs.FirstOrDefault().ClientId 
    }); 

如果沒有AdminEventLogsClientEventLogs這將引發空異常錯誤。也有可能,但不太可能,item爲空。

+0

是的那兩個最後一行問題(當然)。實際的問題是邏輯中的錯誤(這些屬性不應該爲空)。感謝提醒我爲什麼在調用它的屬性之前,我總是必須檢查一個實際的對象是否存在。 – 2014-10-02 13:03:48

+1

在不檢查null的情況下解引用'FirstOrDefault'返回的對象始終是個問題(如果'T'是引用類型的話)。在訪問它之前,您需要檢查null。 – 2014-10-02 13:44:39

1

我相信這兩條線是問題所在。當您使用item.AdminEventLogs.FirstOrDefault()時,如果item.AdminEventLogs沒有任何元素,則它將爲空,因此訪問.AdminId將引發錯誤。同樣的道理也適用於item.ClientEventLogs.FirstOrDefault()

AdminId = item.AdminEventLogs.FirstOrDefault().AdminId, 
ClientId = item.ClientEventLogs.FirstOrDefault().ClientId 

您可以使用.Any()檢查item.AdminEventLogsitem.ClientEventLogs是否有任何元素。如果是這樣,使用的第一個元件的AdminIdClientId,否則規定AdminIdClientId爲0(假設AdminIdClientId是整數)

AdminId = item.AdminEventLogs.Any() ? item.AdminEventLogs.First().AdminId : 0, 
ClientId = item.ClientEventLogs.Any() ? item.ClientEventLogs.First().ClientId : 0 
+0

謝謝。說實話從來沒有使用.any()擴展方法。我沒有使用三元運算符,因爲總是必須是有效的admin/clientId。問題在於,在沒有創建adminEventLog的情況下添加了該方案,因此它爲item.AdminEventLogs.FirstOrDefault()。AdminId傳遞null。 – 2014-10-02 13:09:07