2013-04-16 3 views
0

저는 EF Code First를 사용하고 있습니다. 여기서는 Professor 객체를 참조하는 클래스입니다.새로 생성 된 개체를 저장하십시오. ASP.NET MVC

public class Mark 
    { 
     public int MarkId { get; set; } 
     [Required(ErrorMessage = "Please provide Grade")] 
     [Display(Name = "Grade Value")] 
     public int MarkValue { get; set; } 

     [Required(ErrorMessage = "Please provide grade type")] 
     [Display(Name = "Grade Type")] 
     public string Type { get; set; } 

     [Required(ErrorMessage = "Please provide Subject")] 
     [Display(Name = "Subject")] 
     public virtual Subject Subject { get; set; } 
     public virtual User User { get; set; } 
     public virtual Professor Professor { get; set; } 


    } 

내 견해로는 마크를 넣은 교수를 선택하는 드롭 다운 메뉴가 있습니다. 나는 이런 식으로 구현 :

//controller 
public MarksController() : this(new MarkRepository()) 
     { 
      IProfessorRepository professorsRepo = new ProfessorRepository(); 
      List<Professor> professors = professorsRepo.All.ToList<Professor>(); 

      List<SelectListItem> items = new List<SelectListItem>(); 
      foreach (Professor p in professors) 
      { 
       items.Add(new SelectListItem 
       { 
        Text = String.Concat(p.FirstName, " ", p.LastName), Value = p.ProfessorId.ToString() 
       }); 
      } 

      items.Add(new SelectListItem 
      { 
       Text = "Please select Professor", Value = "0", Selected = true 
      }); 

      ViewBag.Professors = items; 
     } 
//view create or edit 
<div class="editor-label"> 
    @Html.LabelFor(model => model.MarkValue) 
</div> 
<div class="editor-field"> 
    @Html.EditorFor(model => model.MarkValue) 
    @Html.ValidationMessageFor(model => model.MarkValue) 
</div> 

<div class="editor-label"> 
    @Html.LabelFor(model => model.Type) 
</div> 
<div class="editor-field"> 
    @Html.EditorFor(model => model.Type) 
    @Html.ValidationMessageFor(model => model.Type) 
</div> 

<div class="editor-label"> 
    @Html.LabelFor(model => model.Professor) 
</div> 

<div class="editor-field"> 
    @Html.DropDownList("Professors"); 
</div> 

예, 나는 컨트롤러에서 metod이 저장소 방법 InsertOrUpdate을 호소하는 만들기라는 것입니다 있다는 것을 알고있다.

[HttpPost] 
     public ActionResult Create(Mark mark) 
     { 
      if (ModelState.IsValid) { 
       markRepository.InsertOrUpdate(mark); 
       markRepository.Save(); 
       return RedirectToAction("Index"); 
      } else { 
       return View(); 
      } 
     } 


public void InsertOrUpdate(Mark mark) 
     { 
      if (mark.MarkId == default(int)) { 
       // New entity 
       context.Marks.Add(mark); 
      } else { 
       // Existing entity 
       context.Entry(mark).State = EntityState.Modified; 
      } 
     } 

모든 것이 논리적으로 보이지만 교수가 선택된 상태에서 새로 생성 된 마크 객체를 어떻게 저장할 수 있습니까? ASP.NET은 Controller에서 Create 메서드에 전달 된 개체를 어떻게 정렬합니까? 선생님과 내가 선택한 마크를 어떻게 일치시켜야합니까?

+1

이 한 번 봐 할, 당신은 모델에 ProfessorID이 필요합니다. http://stackoverflow.com/questions/5141714/model-binding-dropdown-selected-value –

답변

2

이걸 살펴보면 모델에 ProfessorId가 필요합니다. 뷰에서 Model binding dropdown selected value

public class Mark 
{ 

    // this will hold the selected value 

    public string ProfessorID { get; set; } 

    public IEnumerable<SelectListItem> Professors 
    { 
     get 
     { 
      return Proffessors     
       .Select(x => new SelectListItem { 
        Value = x.ProfessorId.ToString(), 
        Text = String.Concat(p.FirstName, " ", p.LastName) 
       }); 
     } 
    } 

public IEnumerable<Professor> Proffessors  
    { 
    get 
    { 
     IProfessorRepository professorsRepo = new ProfessorRepository(); 
      return professorsRepo.All; 
    } 
} 

    //the rest of your code 
} 

@Html.DropDownListFor(
    x => x.ProfessorId, 
    new SelectList(Model.Professors, "Value", "Text") 
) 
+0

그건 꽤 작동하지 않습니다 .. NullReferenceException ....보기에서 –

+0

그것이 왜 null로 디버깅하십시오. 나는 당신의 전체 코드를 가지고 있지 않기 때문에 그것을 테스트하지 않았다. –

관련 문제