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布尔值设置为,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.CheckBox, Html.CheckBoxFor),但这应该能让您继续前进,并且清楚地看到发生了什么。

于 2013-04-12T00:21:53.070 回答