aaarianme
aaarianme

Reputation: 282

Passing lists to the view .Net Core

Im looping through all the results from the SQL query in a .Net Core project. here is Model

    public class Mymessagesinfo
{
    public int MyMessagesCount { get; set; }

    public List<int> MessagesIDs { get; set; }
    public List<int> MessagesSendersid { get; set; }
    public List<string> MessagesSenders { get; set; }
    public List<string> MessagesTitles { get; set; }
    public List<string> MessagesInformation { get; set; }

    public List<string> MessagesStatus { get; set; }

}

I loop through the users messages in my controller then i pass that model to the view

sqlcon.Open();
        int? userid = HttpContext.Session.GetInt32("UserID");
        SqlCommand sqlcom = new SqlCommand("select * from messages where Messagereceiver=" +userid , sqlcon);
        SqlDataReader reader = sqlcom.ExecuteReader();
        if(reader.HasRows)
        {
            
            int index = 0;
            while(reader.Read())
            {
                string s;
                s = reader[0].ToString();

                Mymessages.MessagesIDs.Add(int.Parse(s));
                Mymessages.MessagesSendersid.Add(int.Parse(reader[1].ToString()));
                Mymessages.MessagesTitles.Add(reader[3].ToString());
                Mymessages.MessagesInformation.Add(reader[4].ToString());
                Mymessages.MessagesStatus.Add(reader[5].ToString());
                index++;
            }
            Mymessages.MyMessagesCount = index;

        }

the very first line Mymessages.MessagesIDs.Add(int.Parse(s)); it throws an exception saying System.NullReferenceException: 'Object reference not set to an instance of an object i wanted to make sure that reader was holding the results so i added int s and checked on it and it was holding the value it was supposed to. whats going wrong here? is this how we are supposed to pass list-like data to the view?

Upvotes: 1

Views: 61

Answers (2)

Glenn Ferrie
Glenn Ferrie

Reputation: 10390

Here is how I would restructure what you have to make it work.

First, your model class:

public class Mymessagesinfo
{
    public List<MessageInfo> Messages { get; set; } = new List<MessageInfo>();
}

public class MessageInfo
{
    public int ID { get; set; }
    public int Senderid { get; set; }
    public string Sender { get; set; }
    public string Title { get; set; }
    public string Information { get; set; }
    public string Status { get; set; }
}

With this approach you have a list of message objects, instead of a bunch of lists containing property data.

Here is how I would suggest you load it from SQL Server:

    var data = new Mymessagesinfo();
    int? userid = HttpContext.Session.GetInt32("UserID");

    var messagesTable = new System.Data.DataTable("messages");
    using (var sqlcom = sqlcon.CreateCommand())
    {
        sqlcom.CommandText = $"select * from messages where Messagereceiver='{userid}'";
        using (var adapter = new SqlDataAdapter(sqcom))
        {
            adapter.Fill(messagesTable);
        }
    }
    // we are now done with SQL and have the data in memory...
    foreach(DataRow row in messagesTable.Rows) 
    {
        data.Messages.Add( new MessageInfo {
            ID = row.Field<int>(0), 
            Senderid = row.Field<int>(1), 
            Sender = row.Field<string>(2),
            Title = row.Field<string>(3),
            Information = row.Field<string>(4),
            Status = row.Field<string>(5),
        });
    }
    
    return View(data);

 This is a lot cleaner and by using a DataAdapter and DataTable you minimize the amount of time that the connection to the database is connected.

Here is how you would use this model in an MVC View:

@Model Mymessagesinfo

<div>
   <!-- This is where you can display the properties of the message. //-->
   <ul>
     @foreach(var message in Model.Messages) 
     {
         <li> @message.Title - @message.Id </li> 
         
     }
   <ul>
<div>

Upvotes: 1

mj1313
mj1313

Reputation: 8459

You need to initlize MessagesIDs in entity Mymessages, like this:

var Mymessages = new Mymessagesinfo()
{
    MessagesIDs = new List<int>()
};

Mymessages.MessagesIDs.Add(id);

Or just define the class like this,

public class Mymessagesinfo
{
    public int MyMessagesCount { get; set; }

    public List<int> MessagesIDs { get; set; } = new List<int>();
    public List<int> MessagesSendersid { get; set; } = new List<int>();
    public List<string> MessagesSenders { get; set; } = new List<string>();
    public List<string> MessagesTitles { get; set; } = new List<string>();
    public List<string> MessagesInformation { get; set; } = new List<string>();

    public List<string> MessagesStatus { get; set; } = new List<string>();

}

Upvotes: 2

Related Questions