2014-12-03 36 views
1

我嘗試添加使用彈出內部PartialView的對象。這是一個簡單的租賃應用程序,其數據模型生成模型First至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拿到第一控制器添加行動)我創建一個RentalObject與RentalApplication(第二構造函數)用作模型。目前爲止,彈出式對話框顯示了RentalApplication中的PricePerHour和Currency值。

然而,當我在PartialView彈出提交表單一切都被複制,但RentalApplication對象。它以某種方式最終使用原始的RentalApplication中的PricePerHour和Currency創建一個新的RentalObject對象,但不包含RentalApplication屬性下的對象本身。我的調試器甚至會轉到RentalObject的第一個構造函數。

所以我想從控制器提交時查看(GET),並返回到控制器(POST)它有麻煩保持一個複雜對象的另一個對象中。這對我來說只是一個糟糕的做法嗎?我應該使用ViewModel嗎?

+0

你渲染'RentalApplication'任何控制在你看來讓他們回來後?是的它會使用第一(無參數)構造函數 - 這是怎麼了'ModelBinder'作品 - 它使用反射來初始化這需要一個參數的構造函數一個新的實例(事實上,如果你刪除它,它會拋出一個異常) – 2014-12-03 23:43:07

回答

1

在過去,我不得不使用@Html.HiddenFor(m=>m.yourObjectHere)上沒有形式改變的對象,讓他們再次獲得新-ED了。我爲表單中沒有使用的每個對象(大約2或3)都做了這個。

希望這會有所幫助。

+1

使用HiddenFor,然後在控制器中使用FormCollection捕獲它。 – shmow 2015-02-08 13:41:14

相關問題