2017-08-23 8 views
0

2週間前に同様の質問を投稿しましたが、デバッグに問題が発生していました。 @Stephen Mueckeに感謝してくれてありがとう。私は以下のように、問題の後半に何の牽引力もないので、転記しています。viewmodelリストに文字列値を挿入する

membertypeに基づいて企業の一覧を表示するサイト関数で作業していますが、C#でリストがどのように構築されているかという問題が発生しています。コードをテストすると、処理されない例外エラーが発生し、デバッグはリストが空であることを示します。ここで

はviewmodelのである:ここでは

public class MemberListViewModel 
{ 
    public List<string> MemberList { get; set; } 
    public string MemberType { get; set; } 
} 

は、コントローラのコードです:

public class MemberListController : Controller 
{ 
public ActionResult MemberList() 
{ 
    return PartialView(PrepareMemberListViewModel()); 
} 

private MemberListViewModel PrepareMemberListViewModel() 
{ 
    MemberListViewModel viewModel = new MemberListViewModel(); 

    string orgType = "Distributor"; //TODO: hardcoded for dev 

    DataTable table = new DataTable(); 

    using (var connection = new SqlConnection("Provider=SQLOLEDB;Data Source=db.site.net;Persist Security Info=True;Initial Catalog=DB;User ID=SA;Password=PW")) 
    { 
     connection.Open(); 
if (orgType == "Manufacturer") 
     { 
      using (var command = new SqlCommand("SELECT Member FROM dbo.view WHERE [Member Type] = 'Manufacturer' and [Member Code] <> 'Associate - HBW'", connection)) 
       table.Load(command.ExecuteReader()); 
     } 
     else if (orgType == "HBW") 
     { 
      using (var command = new SqlCommand("SELECT Member FROM dbo.view WHERE [Member Type] = 'Manufacturer' and [Member Code] = 'Associate - HBW'", connection)) 
       table.Load(command.ExecuteReader()); 
     } 
     else 
     { 
      using (var command = new SqlCommand("SELECT Member FROM dbo.view WHERE [Member Type] = '" + orgType + "'", connection)) 
       table.Load(command.ExecuteReader()); 
     } 
connection.Close(); 
    } 

    for (int i = 0; i < table.Rows.Count; i++) 
     { 
      string memberName = table.Rows[i]["Member"].ToString(); 
      viewModel.MemberList.Add(memberName); 
     } 

    return viewModel; 
} 
} 

私はデバッグするとき、我々はそのラインで

viewModel.MemberList.Add(memberName); 

に到達するまで、すべてがスムーズに実行しますviewModel.Memberlistのローカル値は、頑強にnullのままです。私はテーブルに値があることを確認しました - この場合、35行、会社名で。

私は何かシンプルなものを紛失していることを知っていますが、それは何であるか分かりません。前もって感謝します!

+1

あなたのリストをインスタンス化したことはありません。 – Fran

+0

MemberListのインスタンス化 – Atul

+0

クラスのコンストラクタのリストプロパティをインスタンス化して、ヌルリストにアクセスしないようにすることをお勧めします。 – Fran

答えて

2

NULLAddメソッドを呼び出しているため、通常のnull参照例外が発生します。

メソッドを呼び出す前に空のコレクションに初期化しておくこと/アクセスすることを確認してください。

var viewModel = new MemberListViewModel(); 
viewModel.MemberList= new List<string>(); 

またはオブジェクト初期化子の構文を使用して

var viewModel = new MemberListViewModel 
        { 
         MemberList= new List<string>() 
        }; 

私見ではデータ、それは空のリストあってはならない場合は、コレクション型のプロパティは、nullになることはありません。あなたの問題を解決する別の方法は、クラス定義を更新して、このプロパティを空のリストに初期化するコンストラクタを持つことです。

public class MemberListViewModel 
{ 
    public List<string> MemberList { get; set; } 
    public string MemberType { get; set; } 

    public MemberListViewModel() 
    { 
     this.MemberList = new List<string>(); 
    } 
} 
+0

私はそれが何か単純なものになることを知っていました...ありがとう、@シージー、そして説明に感謝します。私はあなたの3番目の推薦であなたの推論に同意します、それで、presto - pageの作品と一緒に行きました。再度、感謝します! – chipsterva69

関連する問題