ASP MVC Using a ViewModel

本文关键字:ViewModel Using MVC ASP | 更新日期: 2023-09-27 18:15:23

我的情况下,我想有两个模型在我的视图。我一直试图做到这一点,在下面的控制器,但我不确定如何正确的方式是做到这一点,但我假设它的东西与WellViewModel的实例,然后创建和添加到各自的列表,WellViewModel包含,但我认为我已经混淆了一点,因为我似乎不能让它工作。有提示吗?

这些是我的模型,我已经放入ViewModel:

public class WellViewModel
{
    public List<WellModel> Wells { get; set; }
    public List<AnnotationModel> Annotations { get; set; }  
}

这是我从数据库中检索数据的地方:

    public ActionResult Well(string slideid)
    {
        WellViewModel model = new WellViewModel();
        string cs = dbPath;
        using (SQLiteConnection con = new SQLiteConnection(cs))
        {
            string stm = "SELECT * FROM Well WHERE SlideId = " + "'" + slideid + "'";
            con.Open();
            using (SQLiteCommand cmd = new SQLiteCommand(stm, con))
            {
                using (SQLiteDataReader rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read())
                    {
                        model.Wells = new List<WellModel>() { new WellModel()} //This is not possible to do
                        {
                            SlideId = rdr["SlideId"].ToString(),
                            Well = int.Parse(rdr["Well"].ToString()),
                            TimeStamp = rdr["TimeStamp"].ToString()
                        };
                    }
                    rdr.Close();
                }
            }
            con.Close();
        }       
        using (SQLiteConnection con = new SQLiteConnection(cs))
        {
            string stm = "SELECT * FROM Annotation WHERE SlideId = " + "'" + slideid + "'";
            con.Open();
            using (SQLiteCommand cmd = new SQLiteCommand(stm, con))
            {
                using (SQLiteDataReader rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read())
                    {
                        Annotations = new AnnotationModel
                        {
                            SlideId = rdr["SlideId"].ToString(),
                            Well = int.Parse(rdr["Well"].ToString()),
                            Par = rdr["Par"].ToString(),
                            Time = rdr["Time"].ToString(),
                            Val = rdr["Val"].ToString(),
                            TimeStamp = rdr["TimeStamp"].ToString()
                        };
                    }
                    rdr.Close();
                }
            }
            con.Close();
        }
        return View(model);
    }

ASP MVC Using a ViewModel

在您的while循环中,您创建了一个新的List<WellModel>并添加了单个项目。

应该这样定义:

WellViewModel model = new WellViewModel();
model.Wells = new List<WellModel>();
model.Annotations = new List<AnnotationModel>();
while (rdr.Read())
{
    model.Wells.Add(new WellModel { // set values here };
}

Annotations的其他List做同样的操作。

我看到你的代码的唯一问题是不正确的使用或阅读器填写数据列表。应该在读取循环外初始化列表,然后向其中添加新项:

model.Wells = new List<WellModel>();
using (SQLiteConnection con = new SQLiteConnection(cs))
{
....
while (rdr.Read())
{
    WellModel well = new WellModel
        {
            SlideId = rdr["SlideId"].ToString(),
            Well = int.Parse(rdr["Well"].ToString()),
            TimeStamp = rdr["TimeStamp"].ToString()
        };
    model.Wells.Add(well);
}

另一个列表也是如此。

我认为这将是最好的,如果你添加一个Constructor到你的WellViewModel,你可以设置你的WellModel List和你的AnnotationModel List

一样:

public class WellViewModel
{
   public WellViewModel()
   {
       Wells = new List<WellModel>();
       Annotaions = new List<AnnotationModel>();
   }
   public List<WellModel> Wells { get; set; }
   public List<AnnotationModel> Annotations { get; set; }  
}

在你的while循环中,你可以添加新的WellModel/AnnotationModel

while (rdr.Read())
{
    model.Wells.Add(new WellModel() 
    { 
       // set values here 
    });
}