2015-01-15 135 views
0

我有以下類型的,我使用,以便擴展我們整個系統中使用其他類型的:我基本上是使用這種類型充當一個容器我的剃刀模型是對郵政

public class SystemUser : User 
    { 
     public int? RoleId 
     { 
      get { return this.Relationhip.FirstOrDefault().TypeList.FirstOrDefault().Id();} 
      set { RoleId = value; } 
     } 

     public Role _Role 
     { 
      get { return (Role)RoleId; } 
      set { RoleId = (int)value; } 
     } 

     public SelectListItem[] RolesList { get; set; } 

     public bool IsA(params Role[] roles) 
     { 
      return new List<Role>(roles).Any(v => v.Equals(_Role)); 
     } 

     public bool IsNotA(params Role[] roles) 
     { 
      return !(new List<Role>(roles).Any(v => v.Equals(_Role))); 
     } 
    } 

來自我們數據庫的數據並將它從控制器作爲@model傳遞給我們的視圖。該視圖獲取填充很好,但在使用@ Html.LabelFor()字段修改模型並將該數據傳遞給我們用於將更新的數據保存到數據庫的控制器之後,該模型爲null。如果我單步執行POST,則在我的SystemUser類中的ROleId的getter上得到一個NullReferenceException異常。注意_Role屬性;衆所周知,如果某個類的屬性與其類型具有相同的名稱,則該模型將向控制器發佈空白,但我已經修復了該類型。

這是視圖的肉:

@model SystemUser 
@using (Html.BeginForm("Usr", "Mr", FormMethod.Post, new {@autocomplete="off"})) 
    { 
     //Fields removed for sake of simplifying stackoverflow post 

     <input class="button green-bg" type="submit" value="Save" /> 
     <input class="button gray-bg" type="button" onclick="location.href='@Url.Action("View", "Mr")'" value="Cancel" /> 
    } 

這裏任何幫助將不勝感激。

+3

顯示領域以及和控制器動作以及 – 2015-01-15 15:30:17

+0

只在助手(除顯示器和標籤)字段被綁定到模型中。確保你想要返回的字段在一個 – 2015-01-15 15:31:47

+0

你的控制器是什麼樣的?它是否有與[Usr]同名的方法,並且是用[HttpPost]屬性裝飾的方法?控制器是否真的命名爲[Mr]? – ajawad987 2015-01-15 15:37:09

回答

3

當您在控制器中填充模型以創建視圖時,您將獲得一個EF模型(通過您的代碼的外觀),包括子關係

該視圖將只回發與與頁面中的命名輸入元素匹配的屬性。

由於Relationhip是服務器端收集,該屬性將在null裏面發佈操作。後操作接收該類的簡單版本(外鍵關係未填充)。

如果您需要它,請在控制器內部重新填充該屬性(例如,根據發佈的後端ID值)。

如果你顯示你的控制器代碼和基礎User課呢,我可能能夠提出具體的修改來解決這個:)

解決方法:

確保吸氣性能測試如果集合是存在:

public int? RoleId 
    { 
     get { return this.Relationhip == null ? null : this.Relationhip.FirstOrDefault().TypeList.FirstOrDefault().Id();} 
     set { RoleId = value; } 
    } 

附加:

我也有點擔心,因爲沒有字段支持RoleId屬性,所以set { RoleId = value; }實際上是一個遞歸調用。你可能想檢查一下。

因爲它是一個衍生的財產我本來期望它看起來像這樣(沒有setter):

public int? RoleId 
    { 
     get { return this.Relationhip.FirstOrDefault().TypeList.FirstOrDefault().Id();} 
    } 

,或者如果它是充當數據庫緩存的本地值,添加一個私有字段與屬性:

private int? roleId; 
    public int? RoleId 
    { 
     get 
     { 
      return (roleId = roleId.GetValueOrDefault(this.Relationhip == null ? null : this.Relationhip.FirstOrDefault().TypeList.FirstOrDefault().Id())); 
     } 
     set { roleId = value; } 
    } 
+0

啊。這很有道理。所以,我在我的POST方法的開頭放置了一個斷點,並且在它被擊中之前,我得到了RoleId屬性的getter上的NullReferenceException。我的問題是:甚至在進入POST方法之前試圖訪問此屬性的是什麼? – Killingsworth 2015-01-15 15:49:46

+0

automapper可能正在查看所有公共屬性。通過簡單閱讀該屬性,它會失敗。現在我將爲示例添加一個解決方法。 – 2015-01-15 15:51:25

+0

很酷。我一定會很感激! – Killingsworth 2015-01-15 15:53:29