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

时间:2013-04-11 22:48:16

标签: asp.net-mvc-3 razor

我有一个两难的境地,我希望有人可以帮助我。在加载和更新页面的编辑获取阶段,在加载之前,我存储了像这样检查的复选框:

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。我的问题是如何让我在编辑获取阶段结束时创建的列表保持不变,以便我可以在帖子中使用它?

感谢任何想法。

1 个答案:

答案 0 :(得分: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.CheckBoxHtml.CheckBoxFor),但这应该让你去,很清楚看到发生了什么。

相关问题