2015-10-01 5 views
1

Я в ситуации, когда мне хотелось бы иметь две модели на мой взгляд. Я пытался сделать это, как в контроллере ниже, но я не уверен, как это сделать, но я предполагаю, что это что-то, что делает экземпляр WellViewModel, а затем создавая и добавляя к соответствующие списки, содержит WellViewModel, но я думаю, что я немного путал его, так как я не могу заставить его работать. Любые намеки?ASP MVC Использование ViewModel

Это мои модели, которые я положил в 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); 
    } 

ответ

3

В вашем цикле 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 }; 
} 

Сделайте то же самое для других List из Annotations.

2

Единственная проблема, которую я вижу ваш код является неправильным использованием или читателем для заполнения списков данными. Вы должны инициализировать список вне цикла чтения, а затем просто добавлять новые элементы к нему:

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

Аналогично для другого списка.

2

Я думаю, что это будет лучше, если вы добавите к вашему ConstructorWellViewModel, где вы можете установить 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; } 
} 

В вашем время цикла, то вы можете просто добавить новый WellModel/AnnotationModel.

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

хорошая идея для установки начальных значений в конструкторе. – Ric

+0

Спасибо @Ric. Это мой обычный подход, потому что это очень легко, и вам не нужно запоминать настройку своего списка сначала ... – brothers28

+1

Что-то, что меня сильно укусит. – Ric

Смежные вопросы