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

次の学年に昇格する生徒を選択できるように、追加のチェックボックスを付けてビューに表示したいと思います。それを行う1つの方法は、ビューモデルに入れることです。

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))
4

1 に答える 1

2

非常に基本的な「ステップバイステップ」(SOで行われたので、おそらくいくつかの間違いをしましたが、あなたは考えを持っています)。

この種のことを行うには常にいくつかの方法があるので...実際にそれをサンプルとして取り、他のアイデアを得るために他の例を見つけてください。

まず、コントローラーでGETアクションを実行します(リストを表示するため)。

[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というビューがあります。

このビューでは、各学生の行を含むテーブルを表示します:studentId(この場合は非表示)、名前(表示のみ)、成績(表示のみ)、およびチェックボックス。

細かいモデルバインディングを取得するには、forループ(foreachではない)が必要です。

@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" />
}

このフォームは別のPOSTアクションにつながります(あなたが持っているものに応じて、GETアクションと同じ名前ですHtml.BeginForm

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

少し詳細:

いくつかの本当に基本的な「通常の」慣行を尊重するようにしてください。たとえば、c#では、プロパティは大文字で始める必要があります(StudentGrade、StudentName、Promotedなど)。

于 2012-10-19T19:13:43.287 に答える