1

我一直在为此苦苦挣扎了一段时间,我不确定这是否正确。但我有一个包含三个表格的视图模型,在我看来,我正在使用视图模型。该视图具有需要来自视图模型中的一个表的数据的剑道网格,我无法将模型绑定到网格。任何线索都表示赞赏。Kendo grid mvc with viewmodel

ViewModel.cs:

public class AppAccountMappingViewModel 
    { 
     public virtual List<AppAccountsExternal> AppAccountsExternal { get; set; } 
     public virtual List<AppAccountsInternal> AppAccountsInternal { get; set; } 
     public virtual AppAccountMapping AppAccountMapping { get; set; } 
    } 

我需要AppAccountsInternal名单将它绑定到网格。

控制器:

public ActionResult AppAccountsInternal() 
{ 
     var result = new AppAccountMappingViewModel(); 
     result.AppAccountsInternal= _unitofwork.AppAccountsInternal.GetInternalClients(clientid); 
     return View(result); 
} 

查看:

@model EntityFrameworkClasses.ViewModel.AppAccountMappingViewModel 

@(Html.Kendo().Grid(Model) 
.Name("AppAccountInternalGrid") 
.Columns(columns => 
{ 

    //columns.Bound(p => p.View).Title("View").ClientTemplate("<a href='" + Url.Action("Index","SaveRec") + "' target='_blank'>View</a>").Width(150); 


    columns.Bound(p => p.AppAccountsInternal).Title("Account Internal Name Label1").Width(100); 
    columns.Bound(p => p.Select(x=>x.AccountInternalNameLabel2)).Title("Account Internal Name Label2").Width(130); 

    columns.Bound(p => p.Select(x=>x.AccountInternalNameLabel3)).Title("Account Internal Name Label3").Width(130); 

    columns.Bound(p => p.Select(x=>x.AccountInternalNameLabel4)).Title("Account Internal Name Label4").Width(150); 

    columns.Bound(p => p.Select(x=>x.AccountsInternalID)).Title("Accounts Internal ID").Width(150); 

    columns.Bound(p => p.Select(x=>x.ClientID)).Title("ClientID").Width(150); 

}) 


    .HtmlAttributes(new { style = "height: 550px;" }) 


    .Groupable() 

    .Reorderable(r => r.Columns(true)) 
    .Sortable() 
    .ColumnMenu() 
    .Scrollable(scr => scr.Height(430)) 
    .Filterable() 
.DataSource(dataSource => dataSource 
      .Ajax() 
     .PageSize(50) 
     .ServerOperation(false) 
    .PageSize(20) 


) 

     .Pageable(pageable => pageable 
       .Refresh(true) 
       .Input(true) 
       .Numeric(false) 
      ) 
    .Selectable() 

) 

我正在与所绑定的模式是错误的。什么是正确的做法?任何帮助深表感谢。谢谢!

回答

2

即使你通过你的模型给网格带来初始负载,你需要记住网格从一个叫做端点的ajax读取(它使它自己的调用)。在设计时将模型分配给网格有助于列校验和其他事情。

您应该在网格数据源上实现读取方法,然后使用单独的控制器方法将您的集合返回到网格。

.DataSource(dataSource => dataSource 
     .Ajax() 
     .PageSize(200) 
     .Read(read => read.Action("GetAppAccountsInternaGridData", "MyController", @Model.clientID)) 
     .ServerOperation(false) 

您的控制器需要一种获取网格数据的方法。

using Kendo.Mvc 
... 
[OutputCache(NoStore = true, Duration = 0)]   
public ActionResult GetAppAccountsInternaGridData(int clientID, [DataSourceRequest] DataSourceRequest request) 
{ 
    var result = new AppAccountMappingViewModel(); 
    result.AppAccountsInternal= _unitofwork.AppAccountsInternal.GetInternalClients(clientid); 
    return View(result); 
    return Json(result.AppAccountsInternal.ToDataSourceResult(request), JsonRequestBehavior.AllowGet); 
} 
2

你想从外地AppAccountsInternal绑定到网格中的数据?这可以很容易地完成,但我不明白什么是你试图显示为列的价值观?这似乎不正确。您的类AppAccountsInternal具有名为AccountInternalNameLabel2,AccountInternalNameLabel3和AccountInternalNameLabel4的字段? 如果这只是您的问题的一些示例代码,并且我已经正确理解了所有您需要做的就是将正确的模型绑定到网格并将您的列设置正确。

例如,如果类AppAccountsInternal是这种类型的:

public class AppAccountsInternal 
{ 
    public string AppAccountsInternal1 { get; set; } 
    public virtual string AppAccountsInternal2 { get; set; } 
    public virtual string AppAccountsInternal3 { get; set; } 
} 

网格都应有这样的列。绑定到model.AppAccountsInternal列表并具有名称作为该字段的名称。

@(Html.Kendo().Grid(Model.AppAccountsInternal) 
.Name("AppAccountsInternal ") 
.Columns(columns => 
{ 
    columns.Bound(p => p.AppAccountsInternal1).Title("Account Internal Name Label1").Width(100); 
    columns.Bound(p => p.AppAccountsInternal2).Title("Account Internal Name Label2").Width(130); 
    columns.Bound(p => p.AppAccountsInternal3).Title("Account Internal Name Label3").Width(130); 
    // more columns 
}) 

这是要走的路,如果你只想显示数据。如果你想在你的网格行中进行操作,那么情况就会发生很大变化。您可以使用客户端输入模板提交表单,也可以使用Kendo CRUD操作,但这是另一个问题。