在MVC中将lambda表达式转换为Json
在转换控制器中的lambda表达式时,我收到一个错误(“无法将lambda表达式转换为类型‘string’,因为它不是委托类型”)。我有3个实体,如下所示: 实体:在MVC中将lambda表达式转换为Json,json,asp.net-mvc,entity-framework,lambda,kendo-ui,Json,Asp.net Mvc,Entity Framework,Lambda,Kendo Ui,在转换控制器中的lambda表达式时,我收到一个错误(“无法将lambda表达式转换为类型‘string’,因为它不是委托类型”)。我有3个实体,如下所示: 实体: public class Student { public int ID { get; set; } public string Course { get; set; } public int CityID { get; set; } public virtual City City { g
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"))
)
)
查看:
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"))
)
)
可能与学生实体中存在
City
参数有关。但是City
实体中没有MyRegionName
属性。我假设发生这种情况是因为Student
类没有名为MyRegionName
的属性
你有两个选择
1) 创建一个看起来像学生模型的ViewModel,但使其具有这样的属性。还要确保在ToDataSourceResult
的投影函数中创建了这些新的ViewModel类型,而不是匿名对象
2) 只需使用模板列。e、 g
columns.Template(@<text></text>).Title("MyRegionName").ClientTemplate("#=MyRegionName#");
columns.Template(@).Title(“MyRegionName”).ClientTemplate(“#=MyRegionName”);
非常感谢您的解释。我想使用第二个选项,因为它非常简单。另一方面,有一个小问题:列标题似乎不是其他列标题。我试图找到其他人在这个标题上使用的类,但没有成功(使用“k-link”类)。有没有想过我可以将标准的剑道ui网格头类应用到这个类中?我尝试使用如下标题属性,但没有成功。再次感谢.columns.Template(@).Title(“MyRegionName”).ClientTemplate(“#=MyRegionName”).HeaderHtmlAttributes(新的{@class=“k-link”});