ASP MVC - 从Create的部分视图中获取数据

时间:2013-11-21 11:16:15

标签: c# asp.net asp.net-mvc asp.net-mvc-5

我正在使用ASP.Net MVC 5。 我有两个简单的课程;学生和课程,像这样;

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Course
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Student> Students { get; set; }
}

我想创建一个新的Course,其中包含可选的多个Students。 学生表单/视图将呈现为部分视图(在课程视图中)。

现在我有一个强类型为Course的创建视图。 此视图只有1个文本框 - Course的名称。

我将强类型的部分视图渲染为Student。 为了简化,我只想将1名学生添加到列表中。

我想将学生数据传递给课程对象,然后“继续”到控制器。

任何人都可以帮助我从部分视图传递数据的方法,或者给我一个如何在MVC中完成它的提示? ;)

2 个答案:

答案 0 :(得分:2)

好的,发现我做错了什么。首先,我下载了Html助手BeginCollectionItem。如果您想动态添加和删除将添加到模型中的字段/文本框,那就太棒了。

首先将一个空对象发送到您的视图以供使用(来自您的控制器)。

我刚刚传入一个新的Course对象。 Ctor of Course创建一个包含1个学生对象的新列表。

然后我使用RenderPartial显示partailview +学生项目。

@foreach(var student in Model.Students)
{
  RenderPartial("_Student", student);
}

此视图如下所示:

  

@model Project.Data.Entities.Student

<div class="AddStudent form-group">
    @using (Html.BeginCollectionItem("students"))
    {

    @Html.Label("Name:", new { @class = "control-label col-md-2" })
    <div class="col-md-8">
        @Html.TextBoxFor(x => x.Name)

        <button type="button" class="deletButton btn btn-default">Remove</button>
        @Html.ValidationMessageFor(model => model.Name)
    </div>
    }
</div>

我渲染一个连接按钮以删除(jquery)学生字段。

当我想在我的课程中添加更多学生时,我只需使用ajax调用来添加更多部分“_Student”视图。

<div>
            @Ajax.ActionLink("Add more...", "NewStudentRow", "Course", new AjaxOptions()
            {
                InsertionMode = InsertionMode.InsertAfter,
                UpdateTargetId = "students"
            }, new { @class = "btn btn-default" })
        </div>

我的控制器中的NewStudentRow方法如下所示:

public PartialViewResult NewStudentRow ()
{
    return PartialView("_Student", new Student());
}

如果您只使用http://www.nuget.org/packages/BeginCollectionItem/

,那就非常简单了

答案 1 :(得分:0)

您可以通过拥有多个局部视图来解决此问题。

的伪代码:

CourseView:

<TextBox>@Model.Name</TextBox>
@foreach(var student in Model.Students)
{
  RenderPartial("ShowStudent");
}
RenderPartial("AddStudent");

AddStudentView包含您将学生保存到数据库所需的所有字段。在您执行输入参数的操作中,保存新学生并重定向(例如返回RedirectToAction(“Course”,new {id = student.CourseId}))到Course视图。然后将加载课程视图,包括新学生。

您也可以使用ajax来防止回发,但是由于您没有指定任何阻止回发的愿望,我认为这将是一个很好的解决方案。