具有列表属性的ASP.NET MVC一对多数据库表值

时间:2013-07-31 12:59:41

标签: asp.net-mvc razor one-to-many

我的第一张表是:

第一个表名:联系人
ContactID(PK)
名字
姓氏
公司

第二桌名称:电话
ContactID(FK)
PHONETYPE
******中国

我的观点模特是

public class ContactVM2
{
    public int ContactID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Company { get; set; }

    public string PhoneType { get; set; }
    public string PhoneNumber { get; set; }
}

存储库类是

public class ContactRepository
{
    ContactsDBEntities dbRepo = new ContactsDBEntities();

    public List<ContactVM> GetAllContacts()
    {
        List<ContactVM> ContactViewList = new List<ContactVM>();

        var allContacts = dbRepo.Contacts.ToList();
        var allPhones = dbRepo.Phones.ToList();

        foreach (var cont in allContacts)
        {
            foreach (var ph in allPhones)
            {
                if (cont.ContactID == ph.ContactID)
                {
                    ContactViewList.Add(new ContactVM(){
                        ContactID =cont.ContactID,
                        FirstName=cont.FirstName,
                        LastName=cont.LastName,
                        Company=cont.Company,
                        PhoneType=ph.PhoneType,
                        PhoneNumber=ph.PhoneNumber});
                }
            }
        }

        return ContactViewList;
    }        
}

和Controller是

public ActionResult Index()
    {
        ContactRepository contRepo = new ContactRepository();

        var allContacts = contRepo.GetAllContacts().ToList();

        return View(allContacts);
    }

我在联系人表格中有以下数据 ContactID FirstName LastName公司
1比尔盖茨微软

和电话表中 ContactID PhoneType PhoneNumber
1个首页1111
1个办公室2222

我得到以下结果
1 Bill Gates Home 1111
1 Bill Gates Office 2222

联系方式重复的地方 我需要以下结果
1 Bill Gates Home 1111
办公室2222
我也尝试过在视图中进行以下更改

 <td style="border:2px solid Blue;">
        @{
        foreach (var parent in Model.Where(x=>x.ContactID==item.ContactID).GroupBy(m=>m.PhoneNumber))
       {   
          foreach( var itm in parent )
           {                
             @itm.PhoneNumber <br />
          }    
          } 
          }
    </td>
    <td style="border:2px solid red;">
        @{
        foreach (var parent in Model.Where(x=>x.ContactID==item.ContactID).GroupBy(m=>m.PhoneType))
       {   
          foreach( var itm in parent )
           {                
             @itm.PhoneType <br />
          }    
          } 
          }
    </td>

但它仍然重复记录。
然后我尝试在ModelView中进行以下更改

    public List<string> PhoneType { get; set; }
    public List<string> PhoneNumber { get; set; }

但没有得到结果 任何人都可以提供最简单的示例,因为我处于初级阶段。 视图中没有电话迭代的代码

@foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.ContactID)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.FirstName)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.LastName)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Company)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.PhoneType)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.PhoneNumber)
    </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
        @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
        @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
    </td>
</tr>

1 个答案:

答案 0 :(得分:0)

您应该从存储库类中删除迭代并为电话号码创建一个单独的类,并在ContactVM2中添加该类的变量,如下面的模型:

public class ContactVM2
{
    public int ContactID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Company { get; set; }
    public List<ContactVM2Phone> PhoneList {get; set;}

}
public class ContactVM2Phone
{
    public string PhoneType { get; set; }
    public string PhoneNumber { get; set; }
}

存储库类

public class ContactRepository
{
    ContactsDBEntities dbRepo = new ContactsDBEntities();

    public List<ContactVM> GetAllContacts()
    {
        List<ContactVM> ContactViewList = new List<ContactVM>();


        var allContacts = dbRepo.Contacts.ToList();
        var allPhones = dbRepo.Phones.ToList();

        foreach (var cont in allContacts)
        {
          ContactViewList obj=   new ContactVM()
           obj.ContactID =cont.ContactID;
           obj.FirstName=cont.FirstName;
           obj.LastName=cont.LastName;
           obj.Company=cont.Company;
           List<ContactVM2Phone> Phonelist= new List<ContactVM2Phone>();
            foreach (var ph in allPhones)
            {
                if (cont.ContactID == ph.ContactID)
                {
                    Phonelist.Add(new ContactVM2Phone(){
                        PhoneType=ph.PhoneType,
                        PhoneNumber=ph.PhoneNumber});
                }
            }
           obj.PhoneList =Phonelist;
           ContactViewList.Add(obj);
        }

        return ContactViewList;
    }        
}