2015-02-05 13 views
0

在转换控制器中的lambda表达式期间,出现错误(“无法将lambda表达式转换为类型'string',因为它不是委托类型”)。我有如下3个实体:在MVC中将lambda表达式转换为Json

实体:

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 = 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. 

愿它涉及到存在于学生的实体City参数。但City实体中没有MyRegionName属性。

回答

2

我认为这是因为Student类没有属性MyRegionName

你有两个选择

1)创建一个视图模型,看起来像你的学生的模式,但使其具有这样的属性。还要确保在ToDataSourceResult的投影功能内部创建新的ViewModel类型而不是匿名对象。

2)只需使用模板列。例如

columns.Template(@<text></text>).Title("MyRegionName").ClientTemplate("#=MyRegionName#"); 
+0

非常感谢您的解释。我想使用第二个选项,因为它非常简单。另一方面,有一个小问题:列标题似乎不是其他列标题。我试图找到其他人的类,并在这个头上使用,但它不起作用(使用“k-link”类)。任何想法,我可以申请标准的剑道ui网格标题类到这个?我试图使用如下的标题属性,但没有奏效。非常感谢。 – 2015-02-06 08:34:37

+0

columns.Template(@).Title(“MyRegionName”)。ClientTemplate(“#= MyRegionName#”)。HeaderHtmlAttributes(new {@class =“k-link”}); – 2015-02-06 08:35:10