2014-07-10 120 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; } 

    } 

控制器:

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

编辑FIXED

的问题是VIEW没有引用视图模型作为一个IEnumerable <>。捂脸。

@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

你做错了,它是一个列表。

您不能通过这种方式添加元素。创建对象,并通过调用Add()

添加对象名单做这样在它添加项目:

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 
    } 

编辑: 列表是一个通用的东西,你不需要创建上课。你可以实例化一个列表并在其中添加项目。

你为什么做这样你可以做这样简单:

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正在扩展到设置并获取这些属性的快照类。 – Rick

+0

看到编辑希望它有帮助 –

+0

Ehsan,谢谢。意图是在视图中使用foreach返回ID,GUID等的列表... – Rick

1

建立在什么伊赫桑萨贾德一样,看着public IEnumerator<Snapshot> BrandEmails,我相信你寻找什么,看起来更像是这样的:

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

谢谢,我将移动数据库查询模型,而不是。但是,在此期间,我收到以下错误:无法将models.snapshot转换为模型。brandemaillist – Rick

+0

不!请不要模特。在控制器中做这件事比在模型中要好很多。您将可能会将模型传递给相当多的人,并且不应该让您的模型的任何使用者依赖于数据库访问类。它不应该在控制器中的原因之一。将其移入它自己的**数据库访问类型。类型很便宜! :)至于你的错误,你可能试着将一个实例赋值给一个列表类型的变量,而不是将它添加到列表中。很难说无论你的代码。 – Cornelius

相关问题