我正在使用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中完成它的提示? ;)
答案 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());
}
,那就非常简单了
答案 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来防止回发,但是由于您没有指定任何阻止回发的愿望,我认为这将是一个很好的解决方案。