2012-10-19 2 views
1

나는 지난 며칠 동안 이해하려고 노력한 초보자 질문이 있습니다. 누군가가 프로그래밍 흐름을 이해하는 데 도움이되기를 바랍니다.보기의 모델 및 확인란보기

public class Student 
{ 
    public int studentID { get; set; } 
    public string studentName { get; set; } 
    public strin studentGrade {get; set; } 
} 

public class StudentDBContext : DbContext 
{ 
    public DbSet<Student> Students { get; set; } 
} 

내가 다음에 승진 할 수있는 학생들이 선택할 수 있도록 내가 추가 확인란과 함께보기에 그것을 표시 할 : 나는 모델이 가정

는, 정보는 데이터베이스에 저장됩니다 학년.

public class StudentViewModel 
{ 
    public bool promoted { get; set; } 
    public Student stu { get; set; } 
} 

을하지만이 그것을 할 수있는 방법에 붙어 : 나는 한 가지 방법은 뷰 모델에 넣어 그것이 할 것을 읽어? 그렇다면 어떻게 옆에있는 확인란을 선택하여 모든 학생들을 표시 할 것인가를 결정할 수 있습니다. 그 후, 체크 박스가 체크 된 학생들을 위해 모든 학년을 업데이트하고 싶습니다. 예 :

학생 A, 학생 B, 학생 D가 1 학년에서 2 학년으로 승격되었습니다. 학생을 표시하고 학생 A, B 및 D를 진술하고 성적을 업데이트하기 위해 제출하십시오.

단계별 예제가 크게 감사하겠습니다.

업데이트 1 :

컨트롤러 :

[HttpGet] 
    public ViewResult CheckBox() 
    { 
     var studentViewModels = db.Students.Select(m => new StudentViewModel() 
     { 
      stu = m 
     }).ToList(); 

     return View(studentViewModels); 
    } 

    [HttpPost] 
    public ActionResult CheckBox(IList<studentViewModel> list) 
    { 

     foreach (var stuUpdate in list.Where(m => m.promoted)) 
     { 
      var stuRow = db.Students.Find(stuUpdate.stu.studentID); 
      stuRow.studentName = stuRow.studentName + "1"; 
      db.Entry(stuRow).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("CheckBox"); 
     } 
     return RedirectToAction("CheckBox"); 
    } 

보기 :

그러나 현재 다음과 같은 오류에 의해 명중
@model IList<School.ViewModels.StudentViewModel> 

@using (Html.BeginForm()) 
{ 
<table> 
<tr> 
    <th> 

    </th> 
    <th> 
     student ID 
    </th> 
    <th> 
     student name 
    </th> 
    <th> 
     student grade 
    </th> 
</tr> 
@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.CheckBoxFor(modelItem => item.promoted) 
      @Html.HiddenFor(modelItem => item.stu.studentID) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.stu.studentID) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.stu.studentName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.stu.studentGrade) 
     </td> 
    </tr> 
} 

</table> 
<input type="submit" value="save" /> 
} 

: 값은 null 일 수 없습니다. 매개 변수 이름 : 소스

Source Error: 
foreach (var stuUpdate in list.Where(m => m.promoted)) 
+0

도움 누군가? – blurryMVC

답변

2

아주 기본적인 "단계적으로"(SO에서 수행 그래서 아마 몇 가지 실수를했다, 그러나 당신은 생각이있어).

이런 종류의 작업을 수행하는 방법은 항상 몇 가지가 있으므로 샘플로 받아보고 다른 아이디어를 얻으려면 다른 예제를 찾아보십시오.

글쎄, 먼저 컨트롤러에서 GET 조치 (목록보기)가 있습니다. studentId (이 경우에 숨겨진), 이름 :

[HttpGet] 
public ViewResult StudentList() { 
    //retrieve all students. With the Select, we create a new instance of StudentViewModel for each student. 
    //assuming StudentDbContext being a property of your controller, if it's not, you can instantiate a new one (in a using clause) 
    var studentViewModels = StudentDbContext.Students 
       .Select(m => new StudentViewModel() { 
        stu = m 
        //we don't say nothing about promoted : 
        //it will be there as "false" by default, which is probably what we want. 
       }).ToList(); 
    //now we've got a list of StudentViewModel. This will be the model of our view 
    return View(studentViewModels); 

} 

그리고 우리가보기에, StudentList.cshtml

을 볼 수있어, 우리는 각 학생에 대한 행과 함께 테이블을 표시합니다 (표시 만), 성적 (표시 만) 및 확인란이 있습니다.

훌륭한 모델 바인딩을 얻으려면 for 루프 (foreach가 아님)가 필요합니다.

보십시오 일부를 존중 : (하나를 GET으로 당신이 당신의 Html.BeginForm이 무엇인지의 따라, 동일한 이름)

@model IList<StudentViewModel> 

@using (Html.BeginForm()) { 
<table> 
    <tr> 
    <th>Student name</th> 
    <th>Student grade</th> 
    <th>Promote</th> 
    </tr> 
    @for (var i = 0; i < Model.Count(); i++) { 
    <tr> 
     <td>@Html.HiddenFor(m => Model[i].Student.studentID) 
      @Html.DisplayFor(m => Model[i].Student.studentName) 
     </td> 
     <td>@Html.DisplayFor(m => Model[i]Student.studentGrade)</td> 
     <td>@Html.CheckBoxFor(m => Model[i].promoted)</td> 
    </tr> 
    } 
</table> 
<input type="submit" value="save" /> 
} 

이 양식은

[HttpPost] 
public ActionResult StudentList(IList<StudentViewModel> list) { 
    //we treat only the lines where checkbox has been checked 
    foreach (var studentViewModel in list.Where(m => m.promoted) { 
     var student = StudentDBContext.GetById(studentViewModel.Student.studentID);//get student entity instance from context 
     student.studentGrade ="<new value>"; 
     StudentDBContext.SaveChanges();//save changes, you must have such a method somewhere. 
    } 
    return Action("StudentList"); 
} 

작은 세부 사항 다른 POST 액션으로 이어질 것입니다 정말 기본적인 "일반적인"관행 : 예를 들어 C#에서, 속성은 대문자로 시작해야합니다 (그래서 StudentGrade, StudentName, Promoted 등).

+0

안내해 주셔서 감사합니다. 그러나 POST 메서드에서 값 null 일 수 없다는 오류가 발생합니다. 내가 그리워 하는게있어? 또한 속성에 대한 포인터를 가져 주셔서 감사합니다. 나는 실제로 MVC에서 배우는 학습을하고 있는데, 배우는 데 도움이되는 가이드 또는 튜토리얼이 있습니까? – blurryMVC

+0

@blurryMVC 만약 당신의 실제 코드가 당신의 질문에 편집 된 것이면, 내 대답에서 지적한대로, 당신의'foreach' 루프를'for' 루프로보기 –

+0

약간의 조정을 해줘서 고맙습니다. post 메소드에서. 처음에는 "return Action ("StudentList ");을 나간 후에 만 ​​첫 번째 행을 업데이트합니다. for 루프 바깥쪽에 둘 다 업데이트됩니다. 또한 foreach가 루프 작업을하는 동안 어떻게 작동하지 않는지 알 수 있습니까? 나는 포럼을 읽고 foreach는 루프 자체를 대체 할 것이라고 생각했습니다. foreach가 사용되어서는 안되는 특별한 상황이 있습니까? – blurryMVC