0

誰かが私を助けてくれることを願っているジレンマがあります。ページが読み込まれる前にページを読み込んで更新する Edit Get 段階で、チェックされているチェックボックスを次のように保存します。

foreach (var course in courses.Select((x, i) => new { Data = x, Index = i }))
{
    @:  <td>
        <br /><br /><br />
        <input type="checkbox" id="checkbox" name="selectedCourses" value="@course.Data.CourseID"
            @(Html.Raw(course.Data.Assigned ? "checked=\"checked\"" : "")) />
        </td>
    bool theNewString = course.Data.Assigned;
    String a = theNewString.ToString();
    assignedCourses.Add(a);
}

ビューの上部で、BeginForm で送信できるように、次のようなデータを格納するリストを定義しました。

@{ List<String> assignedCourses = new List<String>(); }

次に、次のようにリストを Edit POST に送信しようとします。

@using (Html.BeginForm(new { assigned = assignedCourses }))

私のコントローラーの署名では、次のようになります。

[HttpPost]
public ActionResult Edit(int id, List<String> assigned)

リストは get ステージの最後にロードされますが、リスト内のデータは Edit POST に渡されません。私の質問は、編集取得ステージの最後に作成したリストを保持して、投稿で使用できるようにするにはどうすればよいですか?

アイデアをありがとう。

4

1 に答える 1

1

これをできるだけシンプルにしようと思います。だからあなたのCourseモデルはこのようなものです...

public class Course
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool Assigned { get; set; }
}

...そして、保存した値を画面に表示して編集したいとします。そのため、コントローラーから始めて、いくつかのデータをダミー化し、Assignedブール値の 1 つを に設定trueして、ページの読み込み時にチェックされるようにしました。

public Controller Courses
{
    public ActionResult Edit(int id)
    {
        var courses = new Course[] {
            new Course() { Id = 1, Name = "maths", Assigned = true },
            new Course() { Id = 2, Name = "english", Assigned = false },
            new Course() { Id = 3, Name = "science", Assigned = false }
        };

        return View(courses);
    }

これで、ページはこれらのコースのコレクションを期待する必要があるため、ページの上部でView期待するタイプを定義します...

cshtml

@model IEnumerable<ExampleProject.Domain.Course>

...これを列挙してView、チェックボックスを作成できます。

@using (Html.BeginForm("Edit", "Courses", FormMethod.Post))
{
    @foreach(var item in Model)
    {
        <label for="@item.Id">@item.Name</label>
        <input type="checkbox" name="courses" id="@item.Id" value="@item.Id" checked="@item.Assigned" />
    }

    <button type="submit">Save changes</button>
}

これにより、次の html がレンダリングされます。

<label for="1">maths</label>
<input type="checkbox" name="courses" id="1" value="1" checked="checked">

<label for="2">english</label>
<input type="checkbox" name="courses" id="2" value="2">

<label for="3">science</label>
<input type="checkbox" name="courses" id="3" value="3">

これで、気に入ったものを確認してフォームを送信できます。真の http ファッションでは、コントローラーのアクションは次の値を受け取りますView:

[HttpPost]
public ActionResult Courses(int id, int[] courses)
{
    // courses will contain the values of the checkboxes that were checked
    return RedirectToAction("Index"); // etc
}

うまくいけば、これが役に立ちます。少し賢く、Html ヘルパーを使用して、より複雑なバインド (例: Html.CheckBoxHtml.CheckBoxFor) を行うこともできますが、これでうまくいくはずです。何が起こっているのかは明らかです。

于 2013-04-12T00:21:53.070 に答える