如何在EDIT GET到EDIT POST期间保存视图中的数据?



我有一个困境,我希望有人能帮助我。在加载和更新页面之前的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。我的问题是我如何得到我在编辑阶段结束时创建的列表,以便我可以在我的帖子中使用它?

谢谢你的建议

我会尽量让它变得简单。所以你的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),但这应该让你继续,并清楚地看到发生了什么

相关内容

最新更新