2014-07-10 2 views
0

클래스를 목록으로 수집 할 다른 클래스로 클래스를 확장하려고합니다.모델 클래스를 다른 모델로 확장하려면 어떻게해야합니까?

모델 :

public class Brand 
    { 
     public int BrandId { get; set; } 
     public string Name { get; set; } 
     public string Guid { get; set; } 
     public float Rating { get; set; } 
     public string Industry { get; set; } 
     public string Address1 { get; set; } 
     public string Address2 { get; set; } 
     public string City { get; set; } 
     public string State { get; set; } 
     public string Postal { get; set; } 
     public string CountryCode { get; set; } 

     public virtual Snapshot Snapshot { get; set; } 
    } 
public class Snapshot 
{ 
     public int ID { get; set; } 
     public string Guid { get; set; } 
     public int CompanyID { get; set; } 
     public string CompanyName { get; set; } 
     public string Email { get; set; } 
     public DateTime DateTimeSent { get; set; } 
     public string Subject { get; set; } 
     public string Html { get; set; } 
     public string Image { get; set; } 
     public string Unsubscribe { get; set; } 
} 
public class BrandSnaphotViewModel 
    { 
     public Brand Brand { get; set; } 
     public List<Snapshot> SnapshotItems { get; set; } 

    } 

컨트롤러 : 고정

문제는보기>를 IEnumerable <로 뷰 모델을 참조하지이었다

public ActionResult Index(string brandGuid) 
    { 
     BrandSnaphotViewModel viewModel = new BrandSnaphotViewModel(); 
     Brand brand = GetBrand(brandGuid); 
     viewModel.Brand = brand; 
     List<Snapshot> snapshot = GetBrandSnapshots(brand.BrandId); 
     viewModel.SnapshotItems = snapshot; 

     List<BrandSnaphotViewModel> viewModelList = new List<BrandSnaphotViewModel>(); 
     viewModelList.Add(viewModel); 

     return View(viewModelList.AsEnumerable()); 
    } 

private Brand GetBrand(string brandGuid) 
{ 
    Brand brand = new Brand(); 
    string dbConnString = WebConfigurationManager.ConnectionStrings["dbConn"].ConnectionString; 
    MySqlConnection dbConn = new MySqlConnection(dbConnString); 
    dbConn.Open(); 
    MySqlCommand dbCmd = new MySqlCommand(); 
    dbCmd.CommandText = "SELECT *, industries.name AS industry_name FROM brands LEFT JOIN industries ON brands.industry_id = industries.industry_id WHERE brand_guid = '" + brandGuid.ToString() + "' AND private = 0 LIMIT 1"; 
    dbCmd.Connection = dbConn; 
    MySqlDataReader dbResult = dbCmd.ExecuteReader(); 
    if (dbResult.Read()) 
    { 
     brand.Guid = dbResult["brand_guid"].ToString(); 
     brand.BrandId = Convert.ToInt32(dbResult["brand_id"]); 
     brand.Industry = dbResult["industry_name"].ToString(); 
    } 
    dbResult.Close(); 
    dbConn.Close(); 

    return brand; 
} 

private List<Snapshot> GetBrandSnapshots(int brandId) 
{ 
    string dbConnString = WebConfigurationManager.ConnectionStrings["dbConn"].ConnectionString; 
    MySqlConnection dbConn = new MySqlConnection(dbConnString); 
    dbConn.Open(); 
    MySqlCommand dbCmd = new MySqlCommand(); 
    dbCmd.CommandText = "SELECT * FROM snapshots WHERE brand_id = " + brandId + " AND archive = 0 ORDER BY date_sent DESC"; 
    dbCmd.Connection = dbConn; 
    MySqlDataReader dbResult = dbCmd.ExecuteReader(); 
    List<Snapshot> snapshots = new List<Snapshot>(); 
    while (dbResult.Read()) 
    { 
     snapshots.Add(new Snapshot 
     { 
      SnapshotId = Convert.ToInt32(dbResult["snapshot_id"]), 
      Subject = dbResult["subject"].ToString(), 
      DateTimeSent = Convert.ToDateTime(dbResult["date_sent"]), 
      Image = dbResult["image"].ToString(), 
      Email = dbResult["email"].ToString(), 
      ContentType = dbResult["content_type"].ToString(), 
      Type = dbResult["type"].ToString() 
     }); 
    } 
    dbResult.Close(); 
    dbConn.Close(); 

    return snapshots; 
} 

편집. 비밀 결사.

@model IEnumerable<projectvia.ViewModels.BrandSnaphotViewModel> 
@{ 
    ViewBag.Title = "Index"; 
} 
@foreach(var item in Model) 
{ 
    @item.Brand.Guid; 
    for(int i = 0; i< @item.SnapshotItems.Count; i++) 
    { 
     @item.SnapshotItems[i].Subject<br/> 
    } 
} 

문제가 해결되었습니다.

통찰력을 얻기 위해 두 전문가 모두에게 감사드립니다 ... 저는 두 가지 조언을 모두 받아서이 솔루션을 제공했습니다.

+0

* SQL 주입 방지에 대한 조언을 검색하십시오. – RobH

+0

@RobH 절대적으로. – Rick

답변

2

잘못하고 있습니다. 목록입니다.

이 방법으로 요소를 추가 할 수 없습니다. 당신이 만들 필요가 없습니다, 목록 일반적인 일이다 :

List<BrandEmailList> brandSnapshotsList = new List<BrandEmailList>(); 
    while (dbResult.Read()) 
    { 
     BrandEmailList brandSnapshots = new BrandEmailList(); // create an object 
     brandSnapshots.ID = Convert.ToInt32(dbResult["snapshot_id"]); 
     brandSnapshots.Guid = dbResult["snapshot_guid"].ToString(); 
     brandSnapshots.DateTimeSent = dbResult["date_sent"]; 
     brandSnapshots.Subject = dbResult["subject"].ToString(); 
     brandSnapshots.Image = dbResult["image"]; 

     brandSnapshotsList.Add(brandSnapshots); // add it in list 
    } 

편집이 : 거기에 항목을 추가 할 같이 할 객체를 생성하고 Add()

를 호출하여 목록에서 해당 개체를 추가 그것을위한 클래스. 목록을 인스턴스화하고 항목을 추가 할 수 있습니다. 에산 사자 드가 무슨 짓을했는지, public IEnumerator<Snapshot> BrandEmails보고, 난 당신이 더 같은 모습을 찾아 믿을

List<Snapshot> brandSnapshotsList = new List<Snapshot>(); 
     while (dbResult.Read()) 
     { 
      Snapshot brandSnapshots = new Snapshot(); // create an object 
      brandSnapshots.ID = Convert.ToInt32(dbResult["snapshot_id"]); 
      brandSnapshots.Guid = dbResult["snapshot_guid"].ToString(); 
      brandSnapshots.DateTimeSent = dbResult["date_sent"]; 
      brandSnapshots.Subject = dbResult["subject"].ToString(); 
      brandSnapshots.Image = dbResult["image"]; 

      brandSnapshotsList.Add(brandSnapshots); // add it in list 
     } 
+0

여전히 ID, Guid 등 ... 정의를 인식하지 못합니다. BrandEmailList가 이러한 속성을 설정하고 가져 오는 Snapshot 클래스로 확장되고 있다고 생각하지 않습니다. – Rick

+0

도움이 되었으면 좋겠다. –

+0

Ehsan, thanks. 그 의도는 ID, GUID 등의 목록을 반환하기 위해 뷰에서 foreach를 사용하는 것이 었습니다. – Rick

1

건물에 :

왜 당신은 간단하게이 방법을 할 수있는 것처럼하고 있습니다

public class Snapshot 
{ 
    public int ID { get; set; } 
    public string Guid { get; set; } 
    // ... 
} 

public class BrandEmailList : List<Snapshot> 
{ 
} 

브랜드 이메일 목록에 새로운 유형을 만들 필요가 없으며 List<Snapshot>을 직접 사용할 수 있습니다.

public ViewResult Whatever() { 
    var brand = GetBrand(brandName); 
    var brandSnapshots = GetBrandSnapshots(); 

    return View(brand, brandSnapshots); 
} 

private Brand GetBrand(string brandName) 
{ 
    try 
    { 
     var brand = new Brand(); 
     brand.Name = brandName; 
     // database stuffs ... 
     return brand; 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

private List<Snapshot> GetBrandSnapshots() 
{ 
    // ... 
    // DB stuffs -- that *really* should not be in the controller anyways. 
    // ... 

    var snapshots = new List<BrandEmailList>(); 
    while (dbResult.Read()) 
    { 
     // object initializer syntax 
     snapshots.Add(new Snapshot { 
      ID = Convert.ToInt32(dbResult["snapshot_id"]), 
     Guid = dbResult["snapshot_guid"].ToString(), 
     DateTimeSent = dbResult["date_sent"], 
     Subject = dbResult["subject"].ToString(), 
     Image = dbResult["image"], 
     });  
    } 
    return snapshots 
} 

보조 노트로, 컨트롤러 방법으로 데이터베이스 액세스를 혼합하는 것은 나쁜 생각 일 수 있습니다. 있을 필요는 없지만 될 수는 있습니다. 일반적으로 데이터베이스에서 데이터를 가져 오는 작업은 MVC 결과를 제공하는 것과는 다른 "수준"에서 발생합니다. MVC 컨트롤러는 데이터베이스와 통신하기위한 "목적"을 가지고 있지 않으며, 작업은 전용 유형으로 위임 될 수 있거나해야합니다. 단일 책임 원칙 부분을 SOLID principles 부분과 비교하십시오.

+0

감사합니다. 대신 DB 쿼리를 모델로 이동합니다. . 그러나 그 동안 다음과 같은 오류가 발생합니다. models.snapshot을 모델로 변환 할 수 없습니다.유명인 브랜드 – Rick

+0

NO! 모델이 아닙니다. 컨트롤러에서 사용하는 것이 모델보다 낫습니다. 모델을 상당히 지나치게 통과시킬 것이고, 모델의 소비자를 데이터베이스 액세스 클래스에 의존해서는 안됩니다. 컨트롤러에 없어야하는 이유 중 하나입니다. 그것을 ** 자신의 ** 데이터베이스 액세스 유형으로 옮깁니다. 종류가 저렴합니다! :) 오류에 관해서는 목록에 * 추가하는 대신 목록 유형 변수에 단일 인스턴스를 * 할당하려고합니다. 하드 승/O를 귀하의 코드를 비록. – Cornelius

관련 문제