Я пытаюсь добавить объект, используя PartialView внутри всплывающего окна. Это простое приложение для аренды, для которого была создана модель данных Model First Through Entity Framework. Контроллеры и представления в основном были подкреплены EF. Взаимосвязь между RentalApplication и RentalObject составляет от 1 до многих, то есть у RentalObject всегда должно быть 1 RentalApplication.Отправка формы не переносит все данные
Мой контроллер выглядит следующим образом:
// GET: /Calendar/Add/1
// Create a PartialView using a RentalObject as the model.
// Use the provided ID to lock in the RentalApplication.
[HttpGet]
public PartialViewResult Add(int id)
{
return PartialView(
new RentalObject(db.RentalApplicationSet.FirstOrDefault(x => x.Id == id)));
}
// POST: /Calendar/Add
// Save the submitted RentalObject to the db
[HttpPost]
public ActionResult Add(RentalObject rentalobject)
{
if (ModelState.IsValid)
{
try
{
db.RentalObjectSet.Add(rentalobject);
db.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
return View();
}
Мой объект выглядит следующим образом:
public partial class RentalObject
{
public RentalObject()
{
this.Lease = new HashSet<Lease>();
}
public RentalObject(RentalApplication rentapp)
{
this.Lease = new HashSet<Lease>();
RentalApplication = rentapp;
PricePerHour = RentalApplication.DefaultPricePerHour;
Currency = RentalApplication.DefaultCurrency;
}
public int Id { get; set; }
public string Name { get; set; }
public bool IsAvailable { get; set; }
public string Illustration { get; set; }
public string Description { get; set; }
public decimal PricePerHour { get; set; }
public string Currency { get; set; }
public virtual ICollection<Lease> Lease { get; set; }
public virtual RentalApplication RentalApplication { get; set; }
}
Так что, когда я открываю всплывающее окно (с помощью @ Ajax.ActionLink получить первый контроллер Добавить action) Я создаю RentalObject с помощью RentalApplication (2-й конструктор) для использования в качестве модели. Это работает до сих пор, всплывающее диалоговое окно показывает значения PricePerHour и Currency из RentalApplication.
Однако, когда я отправляю форму в всплывающее окно PartialView, все копируется, а объект RentalApplication. Это почему-то заканчивается тем, что создает новый объект RentObject, используя PricePerHour и Currency из первоначальной RentalApplication, но не включает сам объект в свойстве RentalApplication. Мой отладчик даже подходит к первому конструктору для RentObject.
Таким образом, у меня возникли проблемы с сохранением сложного объекта внутри другого объекта при отправке с контроллера для просмотра (GET) и обратно в контроллер (POST). Это только плохая практика с моей стороны? Должен ли я использовать ViewModel?
Предоставляете ли вы какие-либо элементы управления для «RentalApplication» в своем представлении, чтобы они отправляли назад ?. И да, он будет использовать первый (без параметров) конструктор - так работает «ModelBinder» - он использует отражение для инициализации нового экземпляра, который требует конструктора без параметров (на самом деле, если вы его удалите, он будет генерировать исключение) –