2013-10-17 36 views
1

編輯 - 的要求,本所認爲...使用實體框架在POST上獲取錯誤 - 值不能爲空。參數名:源

--start編輯

@model salesWebTest.viewModel.vwbooking 

@using (Html.BeginForm()) { 
@Html.AntiForgeryToken() 
@Html.ValidationSummary(true) 

@Html.HiddenFor(model => model.bookings.bookingid) 
@Html.EditorFor(model => model.bookings.name) 

@foreach (var item in Model.traces) 
{ 
    @Html.EditorFor(m => item.contact_Name) 
} 
} 

--end編輯

--start原來的問題 我有一個視圖模型包含兩個班...

public class vwbooking 
{ 
    public booking bookings { get; set; } 
    public IEnumerable<trace> traces { get; set; } 
} 

預訂和跟蹤是一個EDMX實體。

我想用一次保存來更新這兩個類中的數據。

這是我已經試過......

public ActionResult Edit(vwbooking vwbooking) 
{ 
    if (ModelState.IsValid) 
    { 
     db.bookings.Attach(vwbooking.bookings); 
     db.Entry(vwbooking.bookings).State = EntityState.Modified; 
     vwbooking.traces.ToList().ForEach(//THE ERROR OCCURS HERE 
        t => 
        { 
         db.traces.Attach(t); 
         db.Entry(t).State = EntityState.Modified; 
        }); 
     db.SaveChanges(); 
    } 
} 

如果我刪除的痕跡部分,預訂部分將正確更新。

這是GET方法...

public ActionResult Edit(int id = 0) 
{ 
    booking booking = db.bookings.Find(id); 
    var viewModel = new vwbooking(); 
    viewModel.bookings = booking; 
    viewModel.traces = (from l in db.traces where l.bookingid == booking.bookingid select l); 
    return View(viewModel); 
} 

這是我的數據庫上下文類

public class salesContext : DbContext 
{ 
    public salesContext() : base() 
    { 
     Configuration.LazyLoadingEnabled = true; 
    } 

    public salesContext(string Connection) : base(Connection) 
    { 
     Configuration.LazyLoadingEnabled = true; 
    } 

    public DbSet<booking> bookings { get; set; } 
    public DbSet<trace> traces { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     modelBuilder.Entity<booking>().HasKey(e => e.bookingid); 
     modelBuilder.Entity<trace>().HasKey(e => e.traceid); 
    } 
} 
+0

看來'vwbooking.traces'爲空。 –

+0

正確 - 它是 - 但爲什麼?有3個項目顯示在頁面上,我知道db中有3個項目。儘管他們沒有通過,即使vwbooking.bookings是。 – tintyethan

+1

你是如何在視圖中顯示它的?當你回帖時,是否在帖子旁邊?如果不嘗試使用Html.DisplayFor或Html.HiddenFor將其添加到視圖。這樣它必須回傳。 – jannagy02

回答

1

該問題似乎是編輯器設置的方式。我認爲,這是導致模型不正確地綁定在提交

@Html.EditorFor(m => item.contact_Name) 

如果你要檢查這個幫手產生的<input>元素的name屬性,你將很可能看到它的內容

<input name="item.contact_Name" /> 

爲每一個這些。它甚至可以說name="contact_Name"

這是該框架的一個嚴重缺陷,其解決方法通常是製作一個完整的自定義幫助程序或使用前端解決方案修復名稱。

該名稱必須與完全匹配。它應該是你的價值觀是

<input name="traces[0].contact_Name" /> 
<input name="traces[1].contact_Name" /> 
etc.. 

,所以我會建議找出與您當前的項目工程,以確保這些名字得到適當的設置方式。

+0

主要缺點是輕描淡寫。謝謝你的幫助。 – tintyethan

0

你不檢查,如果vwbooking.traces ==叫它空了。雖然您可能期望.ToList()可以保護您免於此,但實體框架可能很古怪(軼事)。與

if (ModelState.IsValid) 
{ 

    db.bookings.Attach(vwbooking.bookings); 
    db.Entry(vwbooking.bookings).State = EntityState.Modified; 
    if(vwbooking.traces != null) 
    { 
      vwbooking.traces.ToList().ForEach(//THE ERROR OCCURS HERE 
      t => 
      { 
      db.traces.Attach(t); 
      db.Entry(t).State = EntityState.Modified; 
      } 
     ); 
     db.SaveChanges(); 
    } 
} 

保護您的通話,你應該沒問題。

+0

的問題是,跡線不應該爲空。這確實可以防止頁面返回錯誤,但數據不會被更新。 – tintyethan

相關問題