2017-08-18 8 views
0

私はUserモデルを持っています。.netコアのViewModelにテーブルリストを追加するには

public class User 
{ 
    public int Id { get; set; } 
    [Required] 
    public string FirstName { get; set; } 
    [Required] 
    public string LastName { get; set; } 
    [Required] 
    public int UserGroupId { get; set; } 
    public UserGroup UserGroup { get; set; } 
} 

これがあるので、私は私の関係が正しいことを願って、私はちょうど.netのコアを開始した管理者、システム管理者などのユーザー・グループを含んでいるでしょう、私のUserGroupモデルなど

public class UserGroup 
{ 
    public int Id {get; set;} 
    public bool Admin {get; set;} 
    public bool SystemAdmin {get; set} 
    public List<User> Users {get; set;} 
} 

です。 私が望むのは、すべてのグループをリストするhtml選択を持つUser Create Viewを持つことです。このようなものですが、ダイナミックなものです。

<select class="form-control m-b" asp-for="Role" required> 
    <option value=""></option> 
    <option value="Admin">Admin</option> 
    <option value="SystemAdmin">System Admin</option> 
</select> 

これは、ユーザー作成フォームに送信するUserGroupViewModelです。

public class UserCreateViewModel 
{ 
    [Required] 
    public string FirstName { get; set; } 
    [Required] 
    public string LastName { get; set; } 
    [Required] 
    public List<UserGroup> UserGroups {get; set;} 
} 

は、最後に私のUserControllerで上の私は、データベースから得たユーザーグループのリストをループさせるつもりだと私はUserCreateViewModelに追加します。

public IActionResult Create() 
    { 
     UserCreateViewModel userCreateViewModel = new UserCreateViewModel(); 

     var userGroups = db.UserGroups.ToList(); 

     foreach(var group in userGroups) 
     { 
      userCreateViewModel.UserGroups.Add(group); 
     } 


     return View(userCreateViewModel); 
    } 

問題は、どのように対処するかわからないというエラーが発生していることです。

enter image description here このエラーは何を意味し、どのように解決できますか?私は経験開発者とは異なるアプローチにもオープンしています。

+1

[NullReferenceExceptionとは何か、どうすれば修正できますか?](https:// stackoverflow。com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) – Tseng

答えて

2

あなたはNULLAddメソッドを呼び出すようにしようとしているので、あなたのコードは、null参照例外でクラッシュしています。 UserCreateViewModelオブジェクトを作成すると、UserGroupsプロパティが空のリストに初期化されておらず、同じことをするコンストラクタもありません。だから基本的にUseGroupsプロパティはnullです。

解決策は、Addメソッドを呼び出す前にUserGroupsプロパティを初期化することです。

var userCreateViewModel = new UserCreateViewModel(); 
userCreateViewModel.UserGroups =new List<UserGroup>(); // Initialize to empty list 

var userGroups = db.UserGroups.ToList(); 

foreach(var group in userGroups) 
{ 
     userCreateViewModel.UserGroups.Add(group); 
} 

または、このプロパティにコレクションを直接設定できます。

var userCreateViewModel = new UserCreateViewModel 
{ 
    UserGroups= db.UserGroups.ToList() 
}; 
+0

ありがとうございます。 – user3862830

2

あなたはローカル変数でグループを格納しているが、あなたは開始時に作成UserCreateViewModelのインスタンスでUserGroupsプロパティを設定する必要があり、これだけ次のように変更します。

var userGroups = db.UserGroups.ToList(); 

へ:

userCreateViewModel.UserGroups = db.UserGroups.ToList(); 

としているので、そこに行っているループをスキップすることができます。なぜなら、私たちはすでに必要な結果を持つUserGroupsコレクションを設定しているからです。

希望すると助かります!

+0

私は新しいソリューションが大好きです。 – user3862830

0

userCreateViewModel.UserGroups = userGroups;

public IActionResult Create() 
{ 
    UserCreateViewModel userCreateViewModel = new UserCreateViewModel(); 

    var userGroups = db.UserGroups.ToList(); 

    userCreateViewModel.UserGroups = userGroups; 

    return View(userCreateViewModel); 
} 
+0

あなたのコードはすべてのグループをリストに2回追加します... – Tseng

+0

本当に!早すぎました。一定! ;-) – DOMZE

関連する問題