We have a page that uses the Kendo Grid along with Kendo DropDownLists. The page has a strongly typed model of type ImportModel. We are trying to POST the entire page at one time. We were able to get it working but it only works in IE. Is there a better way to do this?
ImportModel looks like the following:
public string Country { get; set; } //loaded from Kendo DropDownList
public string Language { get; set; } //loaded from Kendo DropDownList
public IEnumerable<ImportModel.ImportItem> gridItems { get; set; } //this is always NULL in Chrome and Firefox once the grid is POSTed
ImportItem is defined as:
public class ImportItem
{
public bool Enabled { get; set; }
[Required(ErrorMessage = "Site ID is required")]
public string SiteId { get; set; }
[Required(ErrorMessage = "User Name is required")]
public string UserName { get; set; }
public string UserPhone { get; set; }
[Required(ErrorMessage = "User Email is required")]
public string UserEmail { get; set; }
}
The grid:
@(Html.Kendo().Grid<ImportModel.ImportItem>()
.Name("importgrid")
.ToolBar(toolbar =>
{
toolbar.Create();
})
.Columns(columns =>
{
columns.Bound(item => item.SiteId).Width(220).Title("Site ID").Encoded(true).ClientTemplate("#= SiteId #" +
"<input type='hidden' name='gridItems[#= index(data) #].SiteId' value='#= SiteId #' />");
columns.Bound(item => item.UserName).Title("User Name").Encoded(true).ClientTemplate("#= UserName #" +
"<input type='hidden' name='gridItems[#= index(data) #].UserName' value='#= UserName #' />");
columns.Bound(item => item.UserPhone).Title("User Phone").Encoded(true).ClientTemplate("#= UserPhone #" +
"<input type='hidden' name='gridItems[#= index(data) #].UserPhone' value='#= UserPhone #' />");
columns.Bound(item => item.UserEmail).Title("User Email").Encoded(true).ClientTemplate("#= UserEmail #" +
"<input type='hidden' name='gridItems[#= index(data) #].UserEmail' value='#= UserEmail #' />");
})
.Editable(editing => editing.Mode(GridEditMode.InCell))
.Pageable(pager => pager.Refresh(true))
.Navigatable
.DataSource(datasource => datasource
.Ajax()
.Batch(true)
.Read(read => read.Action("GetImportData", "Provisioning"))
.PageSize(100)
.Model(model => model.Id(p => p.BridgeId))
)
)
Below the grid there are standard Kendo DropDownList controls.
The form is defined as:
@using (Html.BeginForm("ProvisioningPost", "Provisioning", FormMethod.Post, new { enctype = "multipart/form-data" }))
The controller method is defined as:
[HttpPost]
public ActionResult ProvisioningPost(string btnSubmit, string btnUploadData, ProvisioningImportModel provisioningImportModel, ProvisioningModel.ImportItem[] gridItems)
gridItems is always NULL for Chrome and Firefox. With IE the data is passed in. What is the best method to POST the entire form to the controller?
ImportModel looks like the following:
public string Country { get; set; } //loaded from Kendo DropDownList
public string Language { get; set; } //loaded from Kendo DropDownList
public IEnumerable<ImportModel.ImportItem> gridItems { get; set; } //this is always NULL in Chrome and Firefox once the grid is POSTed
ImportItem is defined as:
public class ImportItem
{
public bool Enabled { get; set; }
[Required(ErrorMessage = "Site ID is required")]
public string SiteId { get; set; }
[Required(ErrorMessage = "User Name is required")]
public string UserName { get; set; }
public string UserPhone { get; set; }
[Required(ErrorMessage = "User Email is required")]
public string UserEmail { get; set; }
}
The grid:
@(Html.Kendo().Grid<ImportModel.ImportItem>()
.Name("importgrid")
.ToolBar(toolbar =>
{
toolbar.Create();
})
.Columns(columns =>
{
columns.Bound(item => item.SiteId).Width(220).Title("Site ID").Encoded(true).ClientTemplate("#= SiteId #" +
"<input type='hidden' name='gridItems[#= index(data) #].SiteId' value='#= SiteId #' />");
columns.Bound(item => item.UserName).Title("User Name").Encoded(true).ClientTemplate("#= UserName #" +
"<input type='hidden' name='gridItems[#= index(data) #].UserName' value='#= UserName #' />");
columns.Bound(item => item.UserPhone).Title("User Phone").Encoded(true).ClientTemplate("#= UserPhone #" +
"<input type='hidden' name='gridItems[#= index(data) #].UserPhone' value='#= UserPhone #' />");
columns.Bound(item => item.UserEmail).Title("User Email").Encoded(true).ClientTemplate("#= UserEmail #" +
"<input type='hidden' name='gridItems[#= index(data) #].UserEmail' value='#= UserEmail #' />");
})
.Editable(editing => editing.Mode(GridEditMode.InCell))
.Pageable(pager => pager.Refresh(true))
.Navigatable
.DataSource(datasource => datasource
.Ajax()
.Batch(true)
.Read(read => read.Action("GetImportData", "Provisioning"))
.PageSize(100)
.Model(model => model.Id(p => p.BridgeId))
)
)
Below the grid there are standard Kendo DropDownList controls.
The form is defined as:
@using (Html.BeginForm("ProvisioningPost", "Provisioning", FormMethod.Post, new { enctype = "multipart/form-data" }))
The controller method is defined as:
[HttpPost]
public ActionResult ProvisioningPost(string btnSubmit, string btnUploadData, ProvisioningImportModel provisioningImportModel, ProvisioningModel.ImportItem[] gridItems)
gridItems is always NULL for Chrome and Firefox. With IE the data is passed in. What is the best method to POST the entire form to the controller?