将lambda表达式转换为Json

时间:2015-02-05 09:10:15

标签: asp.net-mvc linq lambda kendo-ui entity

首先请确保stackoverflow上的解决方案都没有解决我的问题(可能是由Entity Framework 6引起的)。我有3个实体:学生,城市和地区如下:

实体:

public class Student
{
    public int ID { get; set; }

    public string Course { get; set; }  

    public int CityID { get; set; }

    public virtual City City { get; set; }
}


public class City
{
    public int ID { get; set; }        

    public string Name { get; set; }

    public int RegionID { get; set; }

    public virtual Region Region { get; set; }

    public virtual ICollection<Student> Students { get; set; }    
}


public class Region
{
    public int ID { get; set; }

    public string Name { get; set; }

    public virtual ICollection<City> Cities { get; set; } 
}


控制器:

public ActionResult Index_Read([DataSourceRequest] DataSourceRequest request)
    {
        var dataContext = repository.Students;
        var students = dataContext.ToDataSourceResult(request, m => new 
        {
            ID = m.ID,
            Course = m.Course,

            City = m.City.Name, //I can get City name and show it in View.
            MyRegionName = m.City.Region.Name //I can get region name and assign it to 
//"MyRegionName" parameter in JSON. However in View I cannot get it using "MyRegionName" paremeter  
        });           

        return Json(students, JsonRequestBehavior.AllowGet);
    }


查看:

@model IEnumerable<Student>


@(Html.Kendo().Grid<Student>()
    .Name("Grid")
    .Columns(columns =>
    {
        columns.Bound(m => m.ID);
        columns.Bound(m => m.Course);
        columns.Bound(m => m.City);
        columns.Bound(m => m.MyRegionName);
    })
    .Pageable()
    .Sortable()
    .Filterable()
    .Scrollable()
    .Groupable()    
    .DataSource(dataSource => dataSource
        .Ajax()
        .Read(read => read.Action("Index_Read", "Student"))
    )        
)

以下是可能导致Controller和View中出现问题的要点:

City = m.City.Name, //I can get City name and show it in View.
MyRegionName = m.City.Region.Name //I can get region name and assign it to the  "MyRegionName" parameter in JSON. However in View I cannot get it using "MyRegionName" paremeter.

可能与Student实体中有City参数有关。但MyRegionName实体中没有City属性。

1 个答案:

答案 0 :(得分:1)

在“Index_Read”方法中,您正在创建“IEnumerable of object”,即不是“IEnumerable of Student”类型的学生。但是在视图中,您已将网格绑定到“IEnumerable of Student”。 由于“Student”类不包含“MyRegionName”属性,这就是您面临问题的原因。

尝试这样的事情:

public ActionResult Index_Read([DataSourceRequest] DataSourceRequest request)
    {
        var dataContext = repository.Students;
        var students = dataContext.ToDataSourceResult(request, m => new StudentViewModel
        {
            ID = m.ID,
            Course = m.Course,
            CityName = m.City.Name, 
            RegionName = m.City.Region.Name 
        });           
        return Json(students, JsonRequestBehavior.AllowGet);
    }

public class StudentViewModel
{
    public int ID { get; set; }
    public string Course { get; set; }
    public string CityName { get; set; }
    public string RegionName { get; set; }
}

在视图中:

@model IEnumerable<StudentViewModel>

@(Html.Kendo().Grid<StudentViewModel>()
    .Name("Grid")
    .Columns(columns =>
    {
        columns.Bound(m => m.ID);
        columns.Bound(m => m.Course);
        columns.Bound(m => m.CityName);
        columns.Bound(m => m.RegionName);
    })
    .Pageable()
    .Sortable()
    .Filterable()
    .Scrollable()
    .Groupable()    
    .DataSource(dataSource => dataSource
        .Ajax()
        .Read(read => read.Action("Index_Read", "Student"))
    )        
)