2014-03-05 60 views
3

这里是我的项目的一切:MVC 4 - 剑道网格数据绑定

ControllerA

public ActionResult Index() 
{ 
    return View(); 
} 

public ActionResult User_Read() 
{ 
    ViewModels.ViewModelA objView = new ViewModels.ViewModelA(); 

     objView.MyList = new List<ViewModels.SomeClass>(); 
     objView.MyList.Add(new ViewModels.SomeClass() { FirstName = "FN1", Supervisor = "SV1" }); 
     objView.MyList.Add(new ViewModels.SomeClass() { FirstName = "FN2", Supervisor = "SV2" }); 

     return Json(objView, JsonRequestBehavior.AllowGet); 
} 

ViewModelA

public class ViewModelA 
{ 
    public List<SomeClass> MyList { get; set; } 
} 

public class SomeClass 
{ 
    public string FirstName { get; set; } 
    public string Supervisor { get; set; } 
} 

Index.cshtml

@using Kendo.Mvc.UI 

@(Html.Kendo().Grid<Solution1.ViewModels.ViewModelA>() 
    .Name("grid") 
    .Columns(columns => 
     { 
      columns.Bound(c => c.FirstName); 
      columns.Bound(c => c.Supervisor); 
     }) 
     .HtmlAttributes(new { style = "height: 380px" }) 
     .DataSource(dataSource => dataSource 
      .Ajax() 
      .Read(read => read.Action("User_Read", "ControllerA")) 
     ) 
) 

详细信息:当我运行这个页面加载罚款没有错误,但是,没有数据填充在页面上。所以,网格在那里,但它只显示FirstName和Supervisor的列名。我知道你不应该对数据进行硬编码,但我现在只是试图在网格上展示一些东西,并且我希望数据来自Controller。

问题:为了在网格上显示数据,需要更改哪些内容? 另外,从Controller中的数据中,如何向网格添加多行?

更新:我最初问的问题已部分解决。仍需要帮助才能将数据显示到网格中。

回答

5

您需要做两件事才能使您的代码正常工作。

  1. 您需要返回一个列表(或实际上支持IEnumerable接口的任何东西)。

  2. 您需要通过调用ToDataSourceResult来格式化返回数据。

因此

public ActionResult User_Read([DataSourceRequest]DataSourceRequest request) 
    { 
     var model = new List<ViewModelA>() 
     { 
      new ViewModelA() 
      { 
       FirstName = "Name", 
       Supervisor = "Mgr", 
      }, 
      new ViewModelA() 
      { 
       FirstName = "FirstName", 
       Supervisor = "Supervisor", 
      }, 
     }; 

     return Json(model.ToDataSourceResult(request), JsonRequestBehavior.AllowGet); 
    } 

其他的一切是完全一样的,你必须在你原来的例子,你编辑它。

看看Kendo演示解决方案并研究示例。这不是最好的演示,有时你需要在源代码中进行挖掘,以确切了解到底发生了什么,而不是仅仅依赖演示似乎暗示你需要的东西。例如在通过Ajax演示填充网格演示中,由Ajax调用并返回数据的实际操作方法未在演示中显示!

+0

太好了,这是我的问题的正确解决方案!谢谢。 – JohnAtrik

+0

感谢您的准确答案。为我节省了十几个小时 – warunanc

2

您需要将网格绑定到列表以显示多行。

例如:

public class ViewModelA 
{ 
    public List<SomeClass> MyList { get; set; } 
} 
public class SomeClass 
{ 
    public string FirstName { get; set; } 
    public string Supervisor { get; set; } 
} 

,然后分配值到列表中的网格显示它们。

ViewModelA objView = new ViewModelA() ; 
objView.MyList = new List<SomeClass>(); 
objView.MyList.Add(new SomeClass() { FirstName = "Test", Supervisor = "SomeValue" }); 
objView.MyList.Add(new SomeClass() { FirstName = "AnotherTest", Supervisor = "SomeMore" }); 

通过你的ViewModelA.MyList电网展现的所有元素

@(Html.Kendo().Grid<Solution1.ViewModels.ViewModelA.MyList>() 
    .Name("grid") 
    .Columns(columns => 
     { 
      columns.Bound(c => c.FirstName); 
      columns.Bound(c => c.Supervisor); 
     }) 
     .HtmlAttributes(new { style = "height: 380px" }) 
     .DataSource(dataSource => dataSource 
      .Ajax() 
      .Read(read => read.Action("User_Read", "ControllerA")) 
     ) 
) 
+0

这回答我的问题的一半,但网格仍然不显示数据。我会更新我的原文,以反映您提供的信息。 – JohnAtrik

+0

@JohnAtrik更新了我的答案。希望这可以帮助。 –

0

这里有一些改变,你必须做出

你的数据在MyList可用,但要创建网格因此,您必须从控制器返回MyList并使用该列表构建网格。

在控制器

public ActionResult User_Read() 
    { 
     ViewModels.ViewModelA objView = new ViewModels.ViewModelA(); 

      oViewModelA objView = new ViewModelA() ; 
      objView.MyList = new List<SomeClass>(); 
      objView.MyList.Add(new SomeClass() { FirstName = "Test", Supervisor =     "SomeValue" }); 
      objView.MyList.Add(new SomeClass() { FirstName = "AnotherTest", Supervisor = "SomeMore" }); 

      return Json(objView.MyList, JsonRequestBehavior.AllowGet); 
    } 

在Index.cshtml

@using Kendo.Mvc.UI 

@(Html.Kendo().Grid<SomeClass>() 
    .Name("grid") 
    .Columns(columns => 
     { 
      columns.Bound(c => c.FirstName); 
      columns.Bound(c => c.Supervisor); 
     }) 
     .HtmlAttributes(new { style = "height: 380px" }) 
     .DataSource(dataSource => dataSource 
      .Ajax() 
      .Read(read => read.Action("User_Read", "ControllerA")) 
     ) 
) 

希望这有助于。

+0

'Solution1.ViewModels.ViewModelA.MyList'是一个'属性',但像'type'一样使用是我从中得到的。 – JohnAtrik

+0

对不起,我的不良更新了答案。 –

+0

我尝试了这里列出的所有组合,并且我的网格上没有显示任何组合。我看到的只是列名。 – JohnAtrik

0

你有什么应该工作,从我所看到的,只是改变你的return语句是:

return Json(objView.MyList.ToDataSourceResult(request), JsonRequestBehavior.AllowGet); 

你已经有.Read(read => read.Action("User_Read", "ControllerA")),所以我不知道其他人都在说这是新的东西添加或启示。您可以将列表直接作为DataSourceResult并返回。