【问题标题】:ASP MVC - Get data from partial view on CreateASP MVC - 从创建的部分视图中获取数据
【发布时间】:2013-11-24 01:08:06
【问题描述】:

我正在使用 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 中是如何完成的? ;)

【问题讨论】:

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


    【解决方案1】:

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

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

    我刚刚传入了一个新的 Course 对象。课程主任创建一个包含 1 个学生对象的新列表。

    然后我使用 RenderPartial 来显示一个部分视图 + 学生项目。

    @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/就很简单

    【讨论】:

      【解决方案2】:

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

      伪代码:

      课程视图:

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

      AddStudentView 包含您需要提供以将学生保存到数据库的所有字段。在您接受输入参数的操作中,保存新学生并重定向(类似于 return RedirectToAction("Course", new { id = student.CourseId }) )到课程视图。然后将加载课程视图,包括新学生。

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

      【讨论】:

      • hmmm... 在我做“某事”之前,'Model.Student' 将始终为空。添加数据时循环列表感觉不对。在验证我的课程实体之前,我不想将新学生添加到我的数据库中。我正在使用ajax,是的。现在,如果我将一个空列表和一个新的 Student 对象传递给我的视图,我会做这件愚蠢的事情。稍后我想添加通过java脚本动态添加文本框(=学生姓名)的功能。
      猜你喜欢
      • 2016-08-29
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 2016-03-27
      • 1970-01-01
      相关资源
      最近更新 更多