2012-03-13 6 views
0

컨트롤러에서 데이터를 편집하는 데 문제가 있습니다. 내 두 모델은 다음과 같이 : 내 컨트롤러에서ASP.NET MVC3 ActionResult Edit가 데이터베이스의 변경 내용을 저장하지 않습니다.

[Table("Zielgruppen")] 
public class Zielgruppe 
{ 
    public int Id { get; set; } 
    public string Zielgruppenname { get; set; } 
    public Bezug Bezug { get; set; } 
} 

public class Bezug 
{ 
    public int Id { get; set; } 
    public string Bezugsname { 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();    
} 

내 문제는 내가 변경하는 경우 aktualisierteZielgruppe.Bezug 변경 '원이다 데이터베이스에 저장하지 마라.

이 내 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> 

답변

0

이것은 엔티티 프레임 워크가 약화되어 업데이트 된 연결을 추적하는 경우 중 하나입니다.

나는 여기에 멋진 모델 바인딩 (예 : 데이터베이스에서 모델 바인더를 가져 오는 것)을하지 않는다고 가정합니다.

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

는 또한 개체에 바인딩이 방법은 당신이 잎 있습니다 당신은 바인딩 모델 또는 바인드 동안 화이트리스트 모델 속성에 의해이 공격 벡터를 완화 할 수 open to over-posting attacks. : 여기

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

은보다 전통적인 방법 뷰 모델에 대해 매핑 한 다음 매핑합니다.

+0

감사합니다. 알았어. – willi

1

그것은 당신의 코드에서 말하는 힘들지만, 당신이보기에서 돌아 오는 ID를 기반으로 데이터베이스에서 개체를로드하는 것처럼이 설정 보인다 그것은 State to Modified이며 동일한 객체를 저장합니다.

데이터베이스에 저장하기 전에보기에서 실제로 개체의 속성을 설정하는 것처럼 보이지 않습니다. 어떤 ORM을 사용하고 있습니까? 대부분의 ORM은 각 속성이 수정 될 때 개체의 상태를 처리하고 커밋 될 때 기본적으로 자체 상태를 수정 됨으로 설정합니다.

데이터베이스에서 개체를로드하기 전에 중단 점을 설정하고보기에서 되돌아 오는 값을 신속하게 확인한 다음 데이터베이스에서로드 한 후 다시 빠르게 살펴본다면 사용자가 덮어 쓴 것을 알 수 있습니다.

+0

확인 내 문제는 내가 분명히 방법 '_db.Entry (aktualisierteZielgruppe가) .STATE는 = EntityState.Modified 이해하지 못하는 것입니다 . _Zielgruppenname_ 만 업데이트합니다. 데이터를 업데이트하는 다른 방법이 있습니까? – willi

0

위의 예제 중 하나와 같은 FormCollection를 전달하는 경우, 당신이 그렇게 같은)의 값을 수정하고 TryUpdateModel을 (호출하기 전에 다음 ValueProvider에 FormCollection를 재 할당 할 수 있습니다 : 그러나

this.ValueProvider = collection.ToValueProvider(); 

, 당신이 Zielgruppe처럼 Object를 지나가고 있다면, 나 자신을 알아 내려고 노력하고 있습니다.

0

이것은 Google의 첫 번째 결과이므로 누군가에게 두통을 피할 수 있도록 내 의견을 남겨 두었습니다.

내 경우에는 다음과 같습니다. 내 모델을 만들고 스캐 폴딩으로 필요한 모든 뷰를 만들었습니다. 그 다음 나는 돌아 왔고 내 모델에 외래 키를 추가했다.

색인 및 편집보기에는 포함 된 모든 필드가 나열되어 있지만 외래 키에 할당 된 값은 없습니다. 이로 인해 ModelState가 유효하지 않은 상태로 실행되지 않는 Context.SaveChanges()가 발생했습니다.

아래와 같이 외래 키를 전달하면 문제가 해결되었습니다. `정말 작동합니다

@ Html.HiddenFor (. 모델 => 모델 외래 키)

관련 문제