ASP MVC嵌套模型

时间:2016-03-16 14:23:02

标签: asp.net-mvc models

我需要一个显示标题详细信息行的视图。对于一个简单的案例,我设置了一个包含4个简单表的Course-Student小数据库。课程和学生表与一个部分表相关联,该表还包含学生成绩。此外,Student表由学生类型表拥有。有一个帮助程序类来保存"标题"课程数据和"详细信息"每个上课的学生的名单。

namespace SchoolA.Models
{
public class CourseInfo2
{
    public int CourseID { get; set; }
    public int CourseNumber { get; set; }
    public string CourseName { get; set; }
    public IEnumerable<CourseSectionList> CourseStudentList { get; set; }
}
}
namespace SchoolA.Models
{
public class CourseSectionList
{
    public string Student { get; set; }
    public string Type { get; set; }
    public string Grade { get; set; }
}
}

控制器是:

public ActionResult Courselisting()
    {
        List<CourseInfo2> courseInfo2 = new List<CourseInfo2>();
        List<CourseSectionList> courseSectionList = new List<CourseSectionList>();
        var Cquery = from c in db.Courses select c;
        foreach (var item in Cquery)
        {
            Course course = db.Courses.Find(item.CourseID);   // first find the selected course
            // get the sections
                        foreach (var s in query)  // go through each section
                        {
                           // get the section data
                            courseSectionList.Add(new CourseSectionList
                            {
                                Student = student.StudentName,
                                Type = studentType.StudentTypeName,
                                Grade = s.SectionStudentGrade        
                            });
                        }  // end of section loop
            courseInfo2.Add(new CourseInfo2
            {
                CourseID = course.CourseID,
                CourseNumber = course.CourseNumber,
                CourseName = course.CourseName,
                CourseStudentList = courseSectionList
            });
        }   // end of Course loop
        return View(courseInfo2);    // Course List and Section list for each course
    }

视图是:

    @model SchoolA.Models.CourseInfo2                            
@*  doesn't work either: model List<SchoolA.Models.CourseInfo2>*@
<div>
     <table>
        <tr><th>ID</th> <th>Number</th> <th>Course</th></tr>
        @foreach (var CourseInfo2 in Model)
        {
            <tr>
                <td>
                    @CourseInfo2.CourseID
                </td>
                <td>
                    @CourseInfo2.CourseNumber
                </td>
                <td>
                    @CourseInfo2.CourseName

                </td>
                <td>
                    <table class="table">
                        <tr><th>Student</th> <th>Type</th><th>Grade</th></tr>
                        @foreach (var s in Model.CourseStudentList)
                        {
                            <tr>
                                <td>
                                    @s.Student
                                </td>
                                <td>
                                    @s.Type
                                </td>
                                <td>
                                    @s.Grade
                                </td>
                            </tr>
                        }
                    </table>
                </td>
            </tr>
        }
    </table>
</div>

问题是当我尝试将这两个模型传递给视图时,我遇到了各种错误。在上面的代码中我收到此错误:

CS1579: foreach statement cannot operate on variables of  type 'SchoolA.Models.CourseInfo2' because 'SchoolA.Models.CourseInfo2' does not contain a public definition for 'GetEnumerator'

我已经尝试了许多变体来传递模型但总是遇到另一个错误而另一个错误阻止了两个模型在视图中工作。我应该注意,我独立测试了视图的每个部分,控制器代码工作正常,可以向视图提供正确的数据。但是,我无法将两者结合起来。

问题似乎是我创建模型实例的方式以及它们如何传递给视图。我做错了什么?

3 个答案:

答案 0 :(得分:0)

您已将视图传递给for(var i=0; i<feedArr.length; i++){ (function(feedId) { var listFeedImageQuery = "select imageUrl from feedImages where feedId='"+feedId+"'"; var deleteFeedImagesQuery = "delete from feedImages where feedId='"+feedId+"'"; model.client.query(listFeedImageQuery,function(err,result){ //to be executed later }); })(feedArr[i].feedid); } ,但该视图需要一个List<SchoolA.Models.CourseInfo2>

将您的@model声明更改为SchoolA.Models.CourseInfo2

然后更改IEnumerable<SchoolA.Models.CourseInfo2>循环。

将第一个循环更改为foreach

将内循环更改为foreach (var courseInfo in Model)

答案 1 :(得分:0)

您传递的是对象列表的模型,而在视图中您有单个对象

更改您的视图模型绑定,如下所示:

@model List<SchoolA.Models.CourseInfo2>

答案 2 :(得分:0)

问题:我必须编辑Level2Name(通过UI,它是子网格内的一个文本框)。

我能够编辑Level1name(父网格文本字段)并能够在控制器中获得价值。

问题:如何编辑嵌套的textbox

我尝试过的。

代码:

模型

public class Level0
        {
            public Level0()
            {
                Level1= new List<Level1>();                
            }
            public int? ID{ get; set; }
            public int? NameText{ get; set; }           
            public List<Level1> lev1{ get; set; }
        }

        public class Level1
        {
            public Level1()
            {
                Level2= new List<Level2>();
            }
            public int  Lev1ID  {get;set;}
            public string Level1name{ get; set; }
            public List<Level2> level2{ get; set; }
        }    
        public class Level2
        {
            public string Level2_ID { get; set; }
            public string Level2Name{ get; set; }
        }

UI代码

@for (int i = 0; i < Model.Level1.Count; i++)
   {    
     @Html.HiddenFor(modelItem => Model.Floors[i].Lev1ID  ) 

     @for (int j = 0; j < Model.Level1[i].Level2.Count; j++)
        {
  @Html.HiddenFor(m => m.Level1[i].Level2[j].OP)
  @Html.TextBoxFor(m => m.Level1[i].Level2[j].Level2Name, new { @class = "form-control" })
        }
    }