簡體   English   中英

使用Entity Framework在POST上獲取錯誤-值不能為null。 參數名稱:來源

[英]Getting error on POST with Entity Framework - Value cannot be null. Parameter name: source

編輯-根據要求,這是視圖...

-開始編輯

@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)
}
}

-結束編輯

-開始原始問題我有一個viewModel包含兩個類...

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);
    }
}

問題似乎是編輯器的設置方式。 我認為這導致模型在提交時無法正確綁定

@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..

因此,我建議您找出一種適合您當前項目的方式,以確保正確設置這些名稱。

您在調用之前不檢查vwbooking.traces == null。 盡管您可能希望.ToList()可以保護您免受此侵害,但是Entity Framework可能很古怪(軼事)。 保護您的電話

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();
    }
}

你應該沒事的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM