剑道网格-插入具有外部列的新对象失败

Kendo Grid - inserting new object which has foreign columns fails

本文关键字:新对象 对象 失败 外部 网格 插入      更新时间:2023-09-26

两天以来,我面临着一个严重的问题。我将我的剑道框架版本更新到了最新版本,从那以后,在剑道网格中插入新项目时出现了问题。这个问题以前从未存在过。

在我的网格中,我有一个"机架"对象列表。这个"机架"对象有两个外部列;"房间"answers"客户"

当我想插入一个新机架时,它失败了,因为控制器说"房间和客户信息不应该为空"。所以我的网格不再将外部列信息发送到我的控制器。

这是我的代码:

Rack.aspx

<%:
    Html.Kendo().Grid<dc.Models.Configuration.Rack>()
    .Name("grid")
    .Columns(columns =>
    {
        columns.Bound(r => r.EQU_NAME).Title("Name");
        
        //columns.Bound(r => r.EQU_ROOM).Title("Room").ClientTemplate("#if(!data.EQU_ROOM){#''#}else{# #=data.EQU_ROOM.ROO_DATA_CENTER.DAT_NAME# - #=data.EQU_ROOM.ROO_NAME# #}#").EditorTemplateName("RoomEditor");
        //columns.Bound(r => r.RAC_CUSTOMER).Title("Customer").ClientTemplate("#if(!data.RAC_CUSTOMER){#''#}else{# #=data.RAC_CUSTOMER.CUS_DATA_CENTER.DAT_NAME# - #=data.RAC_CUSTOMER.CUS_NAME# #}#").EditorTemplateName("CustomerEditor");
        columns.Bound(r => r.EQU_PROVIDER).Title("Provider");
        columns.ForeignKey(r => r.EQU_ROOM, (System.Collections.IEnumerable)ViewData["rooms"], "ROO_ID", "ROO_DATA_CENTER").ClientTemplate("#if(!data.EQU_ROOM){#''#}else{# #=data.EQU_ROOM.ROO_DATA_CENTER.DAT_NAME# - #=data.EQU_ROOM.ROO_NAME# #}#").EditorTemplateName("RoomEditor")
            .Title("rooms").Width(150);
        columns.ForeignKey(r => r.RAC_CUSTOMER, (System.Collections.IEnumerable)ViewData["customers"], "CUS_ID", "CUS_DATA_CENTER").ClientTemplate("#if(!data.RAC_CUSTOMER){#''#}else{# #=data.RAC_CUSTOMER.CUS_DATA_CENTER.DAT_NAME# - #=data.RAC_CUSTOMER.CUS_NAME# #}#").EditorTemplateName("CustomerEditor")
            .Title("customer").Width(150);
        
        columns.Bound(r => r.EQU_MODEL).Title("Model");
        columns.Bound(r => r.EQU_REFERENCE).Title("Reference");
        columns.Bound(r => r.EQU_INTERNAL_REFERENCE).Title("Immo ID");
        columns.Bound(r => r.EQU_START_UP_DATE).Title("Start Date").EditorTemplateName("DateEditor").ClientTemplate("#=kendo.toString(data.EQU_START_UP_DATE, 'dd/MM/yyyy')#");
        columns.Bound(r => r.RAC_WIDTH).Title("Width (cm)");
        columns.Bound(r => r.RAC_DEPTH).Title("Depth (cm)");
        columns.Bound(r => r.RAC_UNITS_NUMBER).Title("Units number");
        
        columns.Command(command => { command.Edit(); command.Destroy(); }).Width(200);
    })
    .Resizable(resize => resize.Columns(true)) 
    .Scrollable(scr=>scr.Height(int.Parse(ConfigurationManager.AppSettings["gridScrollableHeight"])))
    .Sortable()
    .ToolBar(toolbar => { toolbar.Create(); toolbar.Excel(); })
    .Excel(excel => excel
        .FileName("DAFYDAC - RACK List.xlsx")
        .Filterable(true)
        .ProxyURL(Url.Action("Excel_Export_Save", "Home")).AllPages(true)
     )
    .Pageable(pageable => pageable
        .Refresh(true)
        
        .ButtonCount(5))
    .Editable(editable => editable.Mode(GridEditMode.InLine))
    .DataSource(dataSource => dataSource
        .Ajax()
        .PageSize(int.Parse(ConfigurationManager.AppSettings["gridPageSize"]))
        .Model(model => { 
            model.Id(r => r.EQU_ID); 
            model.Field(p => p.EQU_ROOM).Editable(true);
            model.Field(p => p.RAC_CUSTOMER).Editable(true);
        })
        //.Events(events => events
        //.RequestEnd("OnRequestEnd_Grid_Equipements")
        //.Error("onError")
        //)
        
        .Read(read => read.Action("Racks_Read", "Configuration"))
        .Create(create => create.Action("Racks_Create", "Configuration"))
        .Update(update => update.Action("Racks_Update", "Configuration"))
        .Destroy(destroy => destroy.Action("Racks_Destroy", "Configuration"))
    )
    
.HtmlAttributes(new { style = ConfigurationManager.AppSettings["gridSize"] })
 %>

房间编辑器.ascx

<%: Html.Kendo().DropDownList()
    .Name("EQU_ROOM")
    .DataValueField("ROO_ID")
    .DataTextField("ROO_DATA_CENTER")
    .OptionLabel("Select a room")
    .Template("#if (!data.ROO_NAME) { #Select a room# } else{ # #=data.ROO_DATA_CENTER.DAT_NAME# - #=data.ROO_NAME# # } #")
    .ValueTemplate("#if (!data.ROO_NAME) { #Select a room# } else{ # #=data.ROO_DATA_CENTER.DAT_NAME# - #=data.ROO_NAME# # } #")
    .BindTo((System.Collections.IEnumerable)ViewData["rooms"])
    .HtmlAttributes(new { data_value_primitive = true})
%>

ConfigurationController.cs

public ActionResult Racks_Create([DataSourceRequest] DataSourceRequest request, Rack rack)
{
    ModelState.Remove("RAC_CUSTOMER.CUS_ROOM.ROO_SENSOR_TEMPO.SENSOR_START_UP_DATE");
    ModelState.Remove("RAC_CUSTOMER.CUS_ROOM.ROO_SENSOR_HYGRO.SENSOR_START_UP_DATE");
    ModelState.Remove("EQU_START_UP_DATE");
    ModelState.Remove("EQU_ROOM.ROO_SENSOR_HYGRO.SENSOR_START_UP_DATE");
    ModelState.Remove("EQU_ROOM.ROO_SENSOR_TEMPO.SENSOR_START_UP_DATE");
     
    if (ModelState.IsValid)
    {
        try
        {
            RackRepository.Instance.Add(rack);
            var results = new[] { rack };
            return Json(results.ToDataSourceResult(request, ModelState), JsonRequestBehavior.AllowGet);
        }
        catch (Exception e)
        {
 
            return this.Json(new DataSourceResult
            {
                Errors = "An error occured! " + e
            });
        }
    }
    else
    {
        return this.Json(new DataSourceResult
        {
            Errors = "An error occured! " + string.Join("; ", ModelState.Values.SelectMany(x => x.Errors).Select(x => x.ErrorMessage))
        });
        //System.Diagnostics.Debug.WriteLine(string.Join("; ", ModelState.Values.SelectMany(x => x.Errors).Select(x => x.ErrorMessage)));
        //throw new Exception("Invalid model in Col_Create");
    }
}

你知道为什么表单不向控制器发送外部列信息吗?

谢谢你的帮助。

您需要将列定义为外键:

@(Html.Kendo().Grid<Kendo.Mvc.Examples.Models.ProductViewModel>()
    .Name("grid")
    .Columns(columns =>
    {
        columns.Bound(p => p.ProductName);
        columns.ForeignKey(p => p.CategoryID, (System.Collections.IEnumerable)ViewData["categories"], "CategoryID", "CategoryName")
            .Title("Category").Width(150);
        columns.Bound(p => p.UnitPrice).Width(150);
        columns.Command(command => command.Destroy()).Width(110);
    })