컬렉션에서 마지막 항목을 삭제하려고하는데 작동하지 않습니다. 먼저 MVC 4와 EF 코드를 사용하고 있습니다. 모든 뷰와 컨트롤러를 생성하고 각 확인란이 컬렉션 유형의 하나의 개체에 대한 확인란이있는 모듈을 추가합니다.
이것은 내 모델입니다.
{
public class Efekt
{
public int ID { get; set; }
public string Symbol { get; set; }
public string Typ { get; set; }
[DataType(DataType.MultilineText)]
public string Opis { get; set; }
[DataType(DataType.MultilineText)]
public string Odnosnik
{
get
{
(...)
}
// set;
}
public virtual ICollection<Obszarowe> EfektyObszarowe { get; set; }
public virtual ICollection<Przedmiot> Przedmioty { get; set; }
public Efekt(){
}
public Efekt(string symbol,string opis,string odnosnik){
(...)
}
}
}
{
public class Obszarowe
{
public int ID { get; set; }
public string Symbol { get; set; }
public string Typ { get; set; }
[DataType(DataType.MultilineText)]
public string Opis { get; set; }
[DataType(DataType.MultilineText)]
public string Odnosnik
{
get
{
(...)
}
// set;
}
public virtual ICollection<Efekt> EfektyKierunkowe { get; set; }
public Obszarowe(){
}
public Obszarowe(string symbol, string opis, string odnosnik)
{
(...)
}
}
}
efektcontroller의 편집 기능
public ActionResult Edit(int id = 0)
{
Efekt efekt = db.Efekts.Find(id);
if (efekt == null)
{
return HttpNotFound();
}
EfektyObszarowe(efekt);
return View(efekt);
}
private void EfektyObszarowe(Efekt efekt)
{
var allObszarowe = db.EfektyObszarowe;
var kierunkoweObszarowe = new HashSet<int>(efekt.EfektyObszarowe.Select(c => c.ID));
var viewModel = new List<KierunkoweObszarowe>();
foreach (var obszar in allObszarowe)
{
viewModel.Add(new KierunkoweObszarowe
{
ID = obszar.ID,
Symbol = obszar.Symbol,
Wybrany = kierunkoweObszarowe.Contains(obszar.ID)
});
}
ViewBag.Courses = viewModel;
}
//
// POST: /Efekt/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(int id , string[] selectedCourses)
{
Efekt efekt = db.Efekts.Find(id);
if (ModelState.IsValid)
{
UpdateObszarowe(selectedCourses, efekt);
db.Entry(efekt).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
EfektyObszarowe(efekt);
return View(efekt);
}
private void UpdateObszarowe(string[] selectedCourses, Efekt instructorToUpdate)
{
if (selectedCourses == null)
{
instructorToUpdate.EfektyObszarowe = new List<Obszarowe>();
return;
}
var selectedCoursesHS = new HashSet<string>(selectedCourses);
var instructorCourses = new HashSet<int>
(instructorToUpdate.EfektyObszarowe.Select(c => c.ID));
//var temp = db.Efekts.Find(instructorToUpdate.ID);
///////// Obszarowe ob;
foreach (var course in db.EfektyObszarowe)
{
if (selectedCoursesHS.Contains(course.ID.ToString()))
{
if (!instructorCourses.Contains(course.ID))
{
instructorToUpdate.EfektyObszarowe.Add(course);
/*ob = db.EfektyObszarowe.Find(Int32.Parse(course));
instructorToUpdate.EfektyObszarowe.Add(ob);
*/
}
}
else
{
if (instructorCourses.Contains(course.ID))
{
instructorToUpdate.EfektyObszarowe.Remove(course);
}
}
}
}
"Obszarowe"체크 박스를 선택 해제해도 괜찮습니다. 컬렉션에서 항목을 삭제하면 체크 된 개체 만 표시되지만 모두 선택 해제하면 차이가 없습니다.
당신은 ...
instructorToUpdate.EfektyObszarowe = new List<Obszarowe>();
하지만 당신 instructorToUpdate
은 ...
Efekt efekt = db.Efekts.Find(id);
이는 EfektyObszarowe
컬렉션이로드되지 않으므로 변경 사항을 추적하지 않음을 의미합니다 . 따라서 다음을 가져올 때 컬렉션을로드해야합니다 Efekt
.
Efekt efekt = db.Efekts.Include(e => e.EfektyObszarowe).Single(e.ID == id);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다