I am currently using the multi select for the first time and am encountering a problem with the scenario I am using.
I have the following cshtml page:
I am then using this editor on the screen:
This then calls the appropriate controller below:
So when I go to my editor and select the first multiselect item I get the drop down option but when I select the second one the change event is constantly firing.
I know it is because of the datasource.read() action being performed which is causing this but how do I prevent this.
What I need to be able to do is select the values in the first multi-select (tenantsIdList) and then it rebind the options back to the SchoolsIdList with the found values.
In addition to this I need to be able to remove items from the (SchoolsIdList) if the corresponding (tenantsIdList) is removed.
For example in the tenants options we have
Tenant 1
Tenant 2
Tenant 3
.....
In the schools list we have
School 1 (which is associated with Tenant 1)
School 2 (which is associated with Tenant 2)
School 3 (which is associated with Tenant 3)
.......
So if I select "Tenant 1" in the first multi select I would only see "School 1" in the second multi select
if I then selected "Tenant 2" in the first multi select I would now see School 1 and School 2.
But then if I de-selected "Tenant 1" I would only want School 2 to be available in addition if School 1 had been selected as a value then this should be removed from the list of selected values.
Any assistance would be greatly received.
I have the following cshtml page:
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<
h2
>Index</
h2
>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@(Html.Kendo().Grid<
InclusionManagerMVC.Models.HouseModels.HouseModel
>()
.Name("HouseGrid")
.HtmlAttributes(new { style = "height:600px;" })
.ToolBar(toolbar =>
{
toolbar.Create();
})
.Columns(columns =>
{
columns.Bound(c => c.ID).Visible(false);
columns.Bound(c => c.Name).Title("House Name");
columns.Bound(c => c.TooltipText).Title("Description");
columns.Bound(c => c.Active).Title("Enabled");
columns.Command(c => c.Edit());
})
.Editable(edit =>
{
edit.TemplateName("HouseModel").Mode(GridEditMode.PopUp);
})
.DataSource(datasource =>
{
datasource.Ajax()
.Create(create => create.Action("Create_House", "Houses", new { area = "Administration" }).Data("sendAntiForgery"))
.Read(read => read.Action("Read_House", "Houses", new { area = "Administration" }))
.Update(update => update.Action("Update_House", "Houses", new { area = "Administration" }).Data("sendAntiForgery"))
.Model(model =>
{
model.Id(field => field.ID);
model.Field(field => field.ID).DefaultValue(Guid.NewGuid());
model.Field(field => field.Name);
model.Field(field => field.Active).DefaultValue(true);
model.Field(field => field.TooltipText).DefaultValue(string.Empty);
model.Field(field => field.SchoolsIdList).DefaultValue(new List<
InclusionManagerMVC.Models.SchoolModels.SchoolsModel
>());
model.Field(field => field.TenantIdList).DefaultValue(new List<
InclusionManagerMVC.Models.TenantModels.TenantsModel
>());
})
.Events(events => events.Error("error_handler"));
})
.Pageable(page => page.PageSizes(new int[] { 10, 20, 50, 100, 250, 1000 }).Refresh(true))
.Sortable()
.Groupable()
.Filterable()
.Scrollable()
.ColumnMenu()
)
}
<
script
type
=
"text/javascript"
>
function tenantsfilter()
{
var multiSelect = $("#TenantIdList").data("kendoMultiSelect");
var values = multiSelect.value($("#value").val());
console.log(values.length);
return { tenants: values.toString() };
}
function refresh_multiSelect(e)
{
console.log(e);
$("#SchoolsIdList").data("kendoMultiSelect").dataSource.read();
}
</
script
>
I am then using this editor on the screen:
@model InclusionManagerMVC.Models.HouseModels.HouseModel
@Html.HiddenFor(m => m.ID)
<
div
class
=
"form-horizontal"
role
=
"form"
style
=
"padding:10px;"
>
<
div
class
=
"form-group"
>
@Html.LabelFor(m => m.Name, new { @class = "form-label col-lg-2" })
<
div
class
=
"col-lg-6"
>
@Html.TextBoxFor(m => m.Name, new { @class = "form-control", placeholder = "Enter name of the house" })
</
div
>
</
div
>
<
div
class
=
"form-group"
>
@Html.LabelFor(m => m.TooltipText, new { @class = "form-label col-lg-2" })
<
div
class
=
"col-lg-6"
>
@Html.TextAreaFor(m => m.TooltipText, new { @class = "form-control", placeholder = "Enter a description about this house" })
</
div
>
</
div
>
<
div
class
=
"form-group"
>
@Html.LabelFor(m => m.Active, new { @class = "form-label col-lg-2" })
<
div
class
=
"col-lg-6"
>
@Html.CheckBoxFor(m => m.Active)
</
div
>
</
div
>
<
div
class
=
"form-group"
>
@Html.LabelFor(m => m.TenantIdList, new { @class = "form-label col-lg-2" })
<
div
class
=
"col-lg-6"
>
@(
Html.Kendo().MultiSelectFor(m => m.TenantIdList)
.DataTextField("Name")
.DataValueField("ID")
.DataSource(datasource =>
{
datasource.Read(read => read.Action("GetTenants", "Houses", new { area = "Administration" }));
})
.Placeholder("Select School Groups")
.IgnoreCase(true)
.HighlightFirst(true)
)
</
div
>
</
div
>
<
div
class
=
"form-group"
>
@Html.LabelFor(m => m.SchoolsIdList, new { @class = "form-label col-lg-2" })
<
div
class
=
"col-lg-8"
>
@(
Html.Kendo().MultiSelectFor(m => m.SchoolsIdList)
.DataTextField("Name")
.DataValueField("ID")
.AutoBind(false)
.DataSource(datasource =>
{
datasource.Read(read => read.Action("GetSchools", "Houses", new { area = "Administration" })
.Data("tenantsfilter"))
.ServerFiltering(true)
.Events(events => events.Error("error_handler").Change("refresh_multiSelect"));
})
.Placeholder("Select Schools")
.IgnoreCase(true)
.HighlightFirst(true)
.ItemTemplate("<
span
class=\"label label-info\">#: data.Name#</
span
><
span
class=\"label label-default\">(#:data.TenantName#)</
span
> ")
)
</
div
>
</
div
>
@Html.Partial("_ErrorPanel")
</
div
>
This then calls the appropriate controller below:
public JsonResult Read_House([DataSourceRequest] DataSourceRequest request)
{
this.Response.Cache.SetCacheability(HttpCacheability.NoCache);
List<
HouseModel
> model = new List<
HouseModel
>();
try
{
model = houseSvc.GetHousesList();
}
catch (Exception error)
{
throw error;
}
return Json(model.ToDataSourceResult(request), JsonRequestBehavior.AllowGet);
}
public JsonResult GetTenants()
{
this.Response.Cache.SetCacheability(HttpCacheability.NoCache);
List<
TenantsModel
> model = tenantSvc.GetTenantsList(true);
return Json(model, JsonRequestBehavior.AllowGet);
}
public JsonResult GetSchools(string tenants)
{
this.Response.Cache.SetCacheability(HttpCacheability.NoCache);
List<
string
> tenantStringList = tenants.Split(',').ToList();
List<
TenantsModel
> tenants2 = tenantSvc.GetTenantsList(true, tenantStringList);
List<
SchoolsModel
> model = schoolSvc.GetSchoolsList(true, tenants2);
return Json(model, JsonRequestBehavior.AllowGet);
}
So when I go to my editor and select the first multiselect item I get the drop down option but when I select the second one the change event is constantly firing.
I know it is because of the datasource.read() action being performed which is causing this but how do I prevent this.
What I need to be able to do is select the values in the first multi-select (tenantsIdList) and then it rebind the options back to the SchoolsIdList with the found values.
In addition to this I need to be able to remove items from the (SchoolsIdList) if the corresponding (tenantsIdList) is removed.
For example in the tenants options we have
Tenant 1
Tenant 2
Tenant 3
.....
In the schools list we have
School 1 (which is associated with Tenant 1)
School 2 (which is associated with Tenant 2)
School 3 (which is associated with Tenant 3)
.......
So if I select "Tenant 1" in the first multi select I would only see "School 1" in the second multi select
if I then selected "Tenant 2" in the first multi select I would now see School 1 and School 2.
But then if I de-selected "Tenant 1" I would only want School 2 to be available in addition if School 1 had been selected as a value then this should be removed from the list of selected values.
Any assistance would be greatly received.