【问题标题】:Passing lists to the view .Net Core将列表传递给视图 .Net Core
【发布时间】:2021-01-06 01:58:02
【问题描述】:

我正在遍历 .Net Core 项目中 SQL 查询的所有结果。这是模型

    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; }

}

我在控制器中遍历用户消息,然后将该模型传递给视图

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;

        }

第一行 Mymessages.MessagesIDs.Add(int.Parse(s)); 它抛出异常说 System.NullReferenceException: 'Object reference not set to an instance of an object 我想确保reader 持有结果,所以我添加了int s 并检查了它,它持有它应该的值。 这里出了什么问题?这就是我们应该将类似列表的数据传递给视图的方式吗?

【问题讨论】:

标签: asp.net asp.net-core asp.net-core-mvc


【解决方案1】:

您需要在实体Mymessages 中初始化MessagesIDs,如下所示:

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

Mymessages.MessagesIDs.Add(id);

或者像这样定义类,

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>();

}

【讨论】:

    【解决方案2】:

    以下是我将如何重组您必须使其发挥作用的内容。

    首先,你的模型类:

    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; }
    }
    

    使用这种方法,您可以获得一个消息对象列表,而不是一堆包含属性数据的列表。

    我建议您从 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.
    

    这是在 MVC 视图中使用此模型的方法:

    @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>
    

    【讨论】:

    • 这太棒了,非常感谢。数据阅读器要了我的命
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多