Я новичок в мире MVC и EF. Сначала я нацелен на MVC 4 EF 5, используя код.Редактирование/просмотр нескольких моделей в одном представлении
Я ищу наилучшую практику для редактирования двух связанных моделей, используя один вид. Для простоты я следующие две модели:
namespace AddressBook.Models
{
public class Contact
{
public int ID { get; set; }
public string First_Name { get; set; }
public string Last_Name { get; set; }
public List<PhoneNumber> PhoneNumbers { get; set; }
}
}
и
namespace AddressBook.Models
{
public class PhoneNumber
{
public int ID { get; set; }
public string Number { get; set; }
public bool Primary { get; set; }
}
}
со следующим контекстом:
using System.Data.Entity;
namespace AddressBook.Models
{
public class DataContext : DbContext
{
public DbSet<Contact> Contacts { get; set; }
public DbSet<PhoneNumber> PhoneNumbers { get; set; }
}
}
Взаимосвязь между контактом и PhoneNumber является один ко многим, однако я хотел бы иметь возможность редактировать first_name, last_name и Number, если для Primary установлено значение true, поэтому мы будем редактировать только один номер телефона на запись контакта.
Я видел похожие сообщения, которые указывают на использование ViewModel, но только примеры моделей просмотра, которые я видел, используются, когда они используются вместо представления, когда вы передаете информацию для выпадающего списка.
Я думаю, у меня есть несколько вопросов:
бы ViewModel выглядеть, как показано ниже?
public class ContactPrimaryNumberViewModel { public Contact ContactToEdit {get; set;} public PhoneNumber PhoneNumberToEdit {get;set;} }
Что бы отредактировали (опубликовали) и отредактировали (получите)?
Любая помощь будет оценена, чтобы помочь мне обернуть мою голову вокруг этого ...
здесь Редактировать (получить) модифицированное для поддержки, если контакт не имеет телефонный номер, связанный
'// GET:/Контактная информация/Редактировать/5
public ActionResult Edit(int id = 0)
{
ContactPrimaryNumberViewModel ContactPrimaryNumber = (from pn in db.PhoneNumbers
where pn.ContactID == id && pn.Primary == true
select new ContactPrimaryNumberViewModel { ContactID = pn.ContactID, First_Name = pn.Contact.First_Name, Last_Name = pn.Contact.Last_Name, Number = pn.Number }).SingleOrDefault();
if (ContactPrimaryNumber == null)
{
ContactPrimaryNumber = (from c in db.Contacts
where c.ID == id
select new ContactPrimaryNumberViewModel { ContactID = c.ID, First_Name = c.First_Name, Last_Name = c.Last_Name, Number = null }).Single();
}
return View(ContactPrimaryNumber);
}'
поэтому окончательное решение после всяких помощь:
модели:
public class PhoneNumber
{
public int ID { get; set; }
public string Number { get; set; }
public bool Primary { get; set; }
[Required]
public int ContactID { get; set; }
public Contact Contact { get; set; }
}
public class Contact
{
public int ID { get; set; }
public string First_Name { get; set; }
public string Last_Name { get; set; }
public List<PhoneNumber> PhoneNumbers { get; set; }
}
контроллер редактировать (получить и ро й)
// GET: /Contact/Edit/5
public ActionResult Edit(int id = 0)
{
ContactPrimaryNumberViewModel ContactPrimaryNumber = (from c in db.Contacts
join pn in db.PhoneNumbers
on c.ID equals pn.ContactID into outer
from _pn in outer.Where(p => p.Primary ==true).DefaultIfEmpty()
where c.ID == id
select new ContactPrimaryNumberViewModel { ContactID = c.ID, First_Name = c.First_Name, Last_Name = c.Last_Name, Number = ((_pn == null) ? "" : _pn.Number) }).FirstOrDefault();
if (ContactPrimaryNumber == null)
{
return HttpNotFound();
}
return View(ContactPrimaryNumber);
}
// POST: /Contact/Edit/5
[HttpPost]
public ActionResult Edit(ContactPrimaryNumberViewModel ContactPrimaryNumber)
{
Contact c = db.Contacts.Find(ContactPrimaryNumber.ContactID);
PhoneNumber pn = db.PhoneNumbers.FirstOrDefault(x => x.ContactID == ContactPrimaryNumber.ContactID && x.Primary == true);
if (ModelState.IsValid)
{
c.First_Name = ContactPrimaryNumber.First_Name;
c.Last_Name = ContactPrimaryNumber.Last_Name;
if (pn == null) //if there is no phone number associated with the contact in the DB
{
if (!String.IsNullOrEmpty(ContactPrimaryNumber.Number))
{
//Add a new phonenumber in the database
PhoneNumber Px = new PhoneNumber();
Px.ContactID = ContactPrimaryNumber.ContactID;
Px.Number = ContactPrimaryNumber.Number;
Px.Primary = true;
db.PhoneNumbers.Add(Px);
}
}
else //if there is a phone number associated with the contactin the DB
{
if (String.IsNullOrEmpty(ContactPrimaryNumber.Number))
{
//delete the existing number
db.PhoneNumbers.Remove(pn);
}
else
{
//modify the existing number
pn.Number = ContactPrimaryNumber.Number;
}
}
db.SaveChanges();
return RedirectToAction("Index");
}
return View(c);
}
и ViewModel
public class ContactPrimaryNumberViewModel
{
public int ContactID { get; set; }
public string First_Name { get; set; }
public string Last_Name { get; set; }
public string Number { get; set; }
}
еще раз спасибо за вашу помощь
Прежде всего вам нужен контактный внешний ключ в PhoneNumber, тогда вы можете создать собственный способ сохранения. Я напишу его в нескольких – Komengem
Привет, Коменге ... спасибо за ответ ...Я просто заметил внешний ключ, когда я попытался сгенерировать scafolding, и он не создал viewbag для меня автоматически, как сейчас выглядит «public class PhoneNumber { public int ID {get; задавать; } public string Number {get; задавать; } public bool Primary {get; задавать; } [Обязательно] public int ContactID {get; задавать; } public Контакт Контакт {get; задавать; } } ' – user2129585
Mhmm Еще один вопрос, прежде чем я напишу вам мой ответ, почему контакт должен иметь несколько номеров? Это действительно необходимо? – Komengem