Asp.net mvc 4 带viewmodel的剑道网格mvc

Asp.net mvc 4 带viewmodel的剑道网格mvc,asp.net-mvc-4,kendo-grid,kendo-asp.net-mvc,asp.net-mvc-viewmodel,Asp.net Mvc 4,Kendo Grid,Kendo Asp.net Mvc,Asp.net Mvc Viewmodel,我已经为此挣扎了一段时间,我不确定这是否正确。但是我有一个带有三个表的视图模型,在我的视图中,我使用的是视图模型。视图有一个剑道网格,它需要来自视图模型中一个表的数据,我无法将模型绑定到网格。任何线索都很感激 ViewModel.cs: public class AppAccountMappingViewModel { public virtual List<AppAccountsExternal> AppAccountsExternal { get; se

我已经为此挣扎了一段时间,我不确定这是否正确。但是我有一个带有三个表的视图模型,在我的视图中,我使用的是视图模型。视图有一个剑道网格,它需要来自视图模型中一个表的数据,我无法将模型绑定到网格。任何线索都很感激

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; }
    }
视图:

@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()

 )
@model EntityFrameworkClasses.ViewModel.AppAccountMappingViewModel
@(Html.Kendo().Grid(模型)
.Name(“AppAccountInternalGrid”)
.列(列=>
{
//columns.Bound(p=>p.View).Title(“View”).ClientTemplate(“”)。宽度(150);
columns.Bound(p=>p.AppAccountsInternal).Title(“账户内部名称标签1”).Width(100);
columns.Bound(p=>p.Select(x=>x.accountinternalnamel2)).Title(“accountinternalnamel2”).Width(130);
columns.Bound(p=>p.Select(x=>x.AccountInternalNameLabel3)).Title(“AccountInternalNameLabel3”).Width(130);
columns.Bound(p=>p.Select(x=>x.AccountInternalNameLabel4)).Title(“AccountInternalNameLabel4”).Width(150);
columns.Bound(p=>p.Select(x=>x.AccountsInternalID)).Title(“账户内部ID”).Width(150);
columns.Bound(p=>p.Select(x=>x.ClientID)).Title(“ClientID”).Width(150);
})
.HtmlAttributes(新的{style=“height:550px;”})
.Groupable()
.Reorderable(r=>r.Columns(true))
.Sortable()
.column菜单()
.可滚动(scr=>scr.高度(430))
.可过滤()
.DataSource(DataSource=>DataSource
.Ajax()
.页面大小(50)
.ServerOperation(错误)
.页面大小(20)
)
.Pageable(Pageable=>Pageable
.刷新(真)
.输入(真)
.数字(假)
)
.可选()
)

我把模型装订起来弄错了。正确的做法是什么?非常感谢您的帮助。谢谢

即使您通过模型将初始负载带到网格中,您也需要记住,网格从一个称为端点的ajax读取(它自己进行调用)。在设计时将模型指定给网格有助于列验证和其他工作

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

.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);
}

即使您通过模型将初始负载引入网格,您也需要记住,网格从一个称为端点的ajax读取(它自己进行调用)。在设计时将模型指定给网格有助于列验证和其他工作

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

.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);
}

是否要将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.appaccounts内部列表,并将字段名称作为名称

@(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操作,但这是另一个问题。

是否要将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.appaccounts内部列表,并将字段名称作为名称

@(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操作,但这是另一个问题