2014-12-03 2 views
1

Я пытаюсь добавить объект, используя 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?

+0

Предоставляете ли вы какие-либо элементы управления для «RentalApplication» в своем представлении, чтобы они отправляли назад ?. И да, он будет использовать первый (без параметров) конструктор - так работает «ModelBinder» - он использует отражение для инициализации нового экземпляра, который требует конструктора без параметров (на самом деле, если вы его удалите, он будет генерировать исключение) –

ответ

1

В прошлом мне приходилось использовать @Html.HiddenFor(m=>m.yourObjectHere) на объектах, которые не были изменены в форме, чтобы не допустить их повторного создания. Я сделал это для каждого объекта, который я не использовал в форме (около 2 или 3).

Надеюсь, это поможет.

+1

Использование HiddenFor, то захват его с помощью FormCollection в контроллере выполнил эту работу. – shmow