【问题标题】:Convert lambda expression to Json将 lambda 表达式转换为 Json
【发布时间】:2015-02-05 09:10:15
【问题描述】:

首先请确保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参数有关。但是City 实体中没有MyRegionName 属性。

【问题讨论】:

  • 对不起,如果这是一个愚蠢的问题,但在您的控制器中,您返回 multipliers,我在示波器上找不到它,而您对 students 无能为力。为什么?
  • 抱歉,为了简化起见,我更新了名称。现在好了,我更新为学生。请再看一遍好吗?提前谢谢..
  • ToDataSourceResult 是什么?你能发布它的代码吗?
  • ToDataSourceResult 方法使用 DataSourceRequest 参数和 LINQ 表达式对数据进行分页、排序、过滤和分组。 action 方法的 JSON 响应将只包含一页数据。网格将绑定到该数据。如果您的数据是由启用 LINQ 的提供程序(实体框架、LINQ to SQL、Telerik OpenAccess、NHibernate 或其他)返回的 IQueryable,则由 ToDataSourceResult 方法创建的 LINQ 表达式将转换为 SQL 并由数据库服务器执行。更多信息:docs.telerik.com/kendo-ui/aspnet-mvc/helpers/grid/ajax-binding
  • @DontVoteMeDown 请回复?谢谢...

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


【解决方案1】:

在“Index_Read”方法中,您正在创建“IEnumerable of object”,即不是“IEnumerable of Student”类型的学生。但鉴于您已将网格绑定到“学生的 IEnumerable”。 由于“学生”类不包含“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"))
    )        
)

【讨论】:

  • 非常感谢您的回复和很好的解释。你是对的,我在你输入时使用学生类。然而,这次我遇到了以下错误:# ERROR 1 # m => new Multiplier ("Cannot convert lambda expression to type 'System.Web.Mvc.ModelStateDictionary' because it is not a delegate type ...") #错误 2 # City.Region.Name = m.City.Region.Name(无效的初始化程序成员声明器)
  • 我之前犯了一个愚蠢的错误(即试图访问复杂对象属性,但实际上我们无法在类初始化程序中访问复杂对象属性)。我已经修改了上面的代码,它现在应该可以工作了。
  • 感谢您的回复。实际上,我已将 viewmodel 用作您的最后一次更新。我唯一想知道的是:我们应该只在 StudentViewModel 上使用必要的属性吗?例如,我的意思是 Student 实体中有 20 个属性,但我们需要其中的 5 个。在那种情况下,我认为我们只在 StudentViewModel 中包含这 5 个属性而不是所有 30 个属性?能稍微澄清一下吗?
  • 在视图模型中,我们只包含视图所需的那些属性。因此,在您的情况下,仅包含 5 个属性。有关视图模型的更多信息,您可以获取here。也请将我的最后一次更新标记为答案:)
  • 感谢您的澄清。当然我标记为答案:)
猜你喜欢
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多