我在控制器中有这个GET方法:
public ActionResult Reserve(int id)
{
ViewBag.staffID = new SelectList(context.Staffs, "staffID", "fName");
ViewBag.roomID = id;
return View();
}
相应的观点:
@model _00002165.Models.Reservation
@{
ViewBag.Title = "Reserve";
}
<h2>Reserve</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<div class="editor-label">
<label>Room Number</label>
</div>
<div class="editor-field">
<input type="text" value="@ViewBag.roomID" readonly name="roomID"/>
</div>
<div class="editor-label">
@Html.LabelFor(model => model.fromDate)
</div>
<div class="editor-field">
@Html.TextBoxFor(model => model.fromDate)
@Html.ValidationMessageFor(model => model.fromDate)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.toDate)
</div>
<div class="editor-field">
@Html.TextBoxFor(model => model.toDate)
@Html.ValidationMessageFor(model => model.toDate)
</div>
<div class="editor-label">
<label>Staff:</label>
</div>
<div class="editor-field">
@Html.DropDownList("staffID", "Select Staff")
@Html.ValidationMessageFor(model => model.staffID)
</div>
<button type="submit">Reserve</button>
}
我想用这些POST方法保存这些输入的数据:
[HttpPost]
public ActionResult Reserve(Reservation res)
{
if (ModelState.IsValid)
{
var customer = context.Customers.First(x => x.username == User.Identity.Name);
res.customerID = customer.customerID;
context.Reservation.Add(res);
context.Entry(res).State = EntityState.Modified;
context.SaveChanges();
return RedirectToAction("Index");
}
}
这给了我以下错误:
Store update, insert, or delete statement affected an unexpected number of rows (0).
人们建议我在我的视图中添加@Html.HiddenFor(model => model.reservationID)
。
但是model.reservationID
是空的。
我该如何解决这个问题? 请帮忙
答案 0 :(得分:0)
您不应该将数据传输对象传递给视图或从视图传递数据传输对象。使用ToModel方法创建一个视图模型,该方法将返回所需的DTO。添加到上下文中,您无需更改状态。
使用此
context.Reservation.Add(res);
context.SaveChanges();
去除
context.Entry(res).State = EntityState.Modified;
如果您要更新,请从数据库中提取记录,进行更改并调用SaveChanges
答案 1 :(得分:0)
context.Entry(res).State = EntityState.Modified;
此行不是必需的 - 如果您手动将某些内容标记为已修改,则会出现这种情况。由于您要添加一个全新的实体,因此正确的值为Added
,默认情况下应该存在。
似乎是在尝试update
而不是insert
,这会导致错误。