C# ASP.NET MVC3操作结果编辑不';t在数据库中保存更改
我在控制器中编辑数据时遇到问题。我的两个模型如下所示:C# ASP.NET MVC3操作结果编辑不';t在数据库中保存更改,c#,asp.net-mvc-3,drop-down-menu,edit,viewbag,C#,Asp.net Mvc 3,Drop Down Menu,Edit,Viewbag,我在控制器中编辑数据时遇到问题。我的两个模型如下所示: [Table("Zielgruppen")] public class Zielgruppe { public int Id { get; set; } public string Zielgruppenname { get; set; } public Bezug Bezug { get; set; } } 及 我的控制器中的功能包括: public ActionResult Edit(int id) {
[Table("Zielgruppen")]
public class Zielgruppe
{
public int Id { get; set; }
public string Zielgruppenname { get; set; }
public Bezug Bezug { get; set; }
}
及
我的控制器中的功能包括:
public ActionResult Edit(int id)
{
Zielgruppe zielgruppe = _db.Zielgruppe.Include("Bezug").Single(z => z.Id == id);
ViewBag.BezugsId = new SelectList(_db.Bezug, "Id", "Bezugsname", zielgruppe.Bezug.Id);
return View(zielgruppe);
}
[HttpPost]
public ActionResult Edit(Zielgruppe aktualisierteZielgruppe)
{
if(ModelState.IsValid)
{
aktualisierteZielgruppe.Bezug = _db.Bezug.Find(aktualisierteZielgruppe.Bezug.Id);
_db.Entry(aktualisierteZielgruppe).State = EntityState.Modified;
_db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.BezugsId = new SelectList(_db.Bezug, "Id", "Bezugsname", aktualisierteZielgruppe.Bezug.Id);
return View();
}
我的问题是,如果我更改aktualisieretezielgruppe.Bezug,这些更改将无法保存在数据库中
if(ModelState.IsValid)
{
aktualisierteZielgruppe.Bezug = _db.Bezug.Find(aktualisierteZielgruppe.Bezug.Id);
// The problem is here. EF doesn't mark associations as modified
// the same way it tracks scalar types.
_db.Entry(aktualisierteZielgruppe).State = EntityState.Modified;
_db.SaveChanges();
return RedirectToAction("Index");
}
这是我的edit.cshtml:
@model Medien_Archiv.Models.Zielgruppe
@{
ViewBag.Title = "Edit";
}
<h2>Edit</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Zielgruppe</legend>
@Html.HiddenFor(model => model.Id)
<div class="editor-label">
@Html.LabelFor(model => model.Zielgruppenname)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Zielgruppenname)
@Html.ValidationMessageFor(model => model.Zielgruppenname)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Bezug)
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.Bezug.Id, ViewBag.BezugsId as SelectList)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@model Medien\u Archiv.Models.Zielgruppe
@{
ViewBag.Title=“编辑”;
}
编辑
@使用(Html.BeginForm()){
@Html.ValidationSummary(true)
齐尔格鲁普
@Html.HiddenFor(model=>model.Id)
@LabelFor(model=>model.Zielgruppenname)
@EditorFor(model=>model.Zielgruppenname)
@Html.ValidationMessageFor(model=>model.Zielgruppenname)
@LabelFor(model=>model.Bezug)
@Html.DropDownListFor(model=>model.Bezug.Id,ViewBag.BezugsId作为SelectList)
}
@ActionLink(“返回列表”、“索引”)
很难从您的代码中分辨出来,但看起来您正在根据从视图返回的id从数据库加载对象,将其状态设置为“已修改”,然后保存相同的对象
看起来,在将对象保存到数据库之前,实际上并没有将属性从视图设置回对象。你在用什么?大多数ORM会在修改每个属性时处理对象的状态,并在提交时将其自身的状态设置为modified
在从数据库加载对象之前设置一个断点,快速查看从视图返回的值,然后在从数据库加载后再次快速查看它们,我认为您会发现您已经覆盖了它们这是实体框架出现问题的一种情况-跟踪更新的关联 我假设您在这里没有进行任何奇特的模型绑定(即,从数据库中提取模型绑定器) 以下是更为传统的方式:
[HttpPost]
public ActionResult Edit(int id, FormCollection collection)
{
// Get the original record to edit from the database.
var gruppe = _db.Zielgruppe.Include("Bezug").Single(z => z.Id == id);
// This will attempt to do the model binding and map all the submitted
// properties to the attached entity.
if (TryUpdateModel(grupppe))
{
_db.SaveChanges();
return RedirectToAction("Index");
}
}
还注意到,绑定到实体的方法使您可以在模型绑定期间通过白名单模型属性减轻此攻击向量,或者绑定到视图模型,然后映射.< /p> 如果您传递到上面示例中的一个示例集合,在调用TryUpdateModel()之前,可以修改其值,然后将FormCollection重新分配给ValueProvider,如下所示:
this.ValueProvider = collection.ToValueProvider();
但是,如果你传入一个对象,比如一个Zielgruppe,我不知道——我自己也在试着找出它。这是谷歌的第一个结果,所以我在这里留下我的评论,以防给别人留点头痛 以下是我的情况。我已经创建了我的模型,并使用脚手架创建了所有必要的视图。然后,我返回并为我的模型添加了一个外键 虽然“索引和编辑”视图列出了我需要的所有字段,但没有为外键指定任何值。这导致永远不会执行context.SaveChanges(),因为ModelState无效 通过使用外键(如下所示),问题得到解决
@Html.HiddenFor(model=>model.ForeignKey)好吧,我的问题是我显然不明白如何
\u db.Entry(aktualisieretezielgruppe).State=EntityState.Modified代码>确实有效。它只更新Zielgruppenname。是否有其他方法更新数据?
this.ValueProvider = collection.ToValueProvider();