簡體   English   中英

如何將模型類擴展到另一個模型?

[英]How do I extend a model class to another model?

我試圖將一個類擴展到另一個類,該類將它們收集為列表。

模型:

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

編輯固定

問題是VIEW沒有將ViewModel引用為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/>
    }
}

那解決了問題。

感謝兩位專家的見解...我接受了這兩項建議,並提出了此解決方案。

您做錯了,這是一個列表。

您不能以這種方式添加元素。 創建對象並通過調用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
        }

基於Ehsan Sajjad所做的工作,查看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原則中單一責任原則部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM