繁体   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