I had a need to bind a select control to a set of json data delievered via a $ ajax call…
C# method
public List<SelectListItem> changeHistorySelect { get; private set; }
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult GetChangeHistorySelect(Int64 Id)
{
var selectListGroup_Info = new SelectListGroup() { Name = "Info"};
var selectListGroup_Allotments = new SelectListGroup() { Name = "Allotments" };
var selectListGroup_Financial = new SelectListGroup() { Name = "Financial" };
var selectListGroup_Daily_Status = new SelectListGroup() { Name = "Daily Status" };
var selectListGroup_Enrollments = new SelectListGroup() { Name = "Enrollments" };
#region Misc Code...
// Build list
changeHistorySelect = new List<SelectListItem>
{
new SelectListItem
{
Value = "",
Text = "- Select -",
Selected = true
},
new SelectListItem
{
Value = "student",
Text = "Student",
Group = selectListGroup_Info
},
new SelectListItem
{
Value = "altAddresses",
Text = "Alternate Addresses",
Group = selectListGroup_Info
},
new SelectListItem
{
Value = "enrollment",
Text = "Enrollment",
Group = selectListGroup_Info
},
new SelectListItem
{
Value = "enrollmentType",
Text = "Enrollment Type",
Group = selectListGroup_Info
},
new SelectListItem
{
Value = "allotteeInfo",
Text = "Allottee Information",
Group = selectListGroup_Allotments
},
new SelectListItem
{
Value = "earnings",
Text = "Earnings",
Group = selectListGroup_Financial
},
new SelectListItem
{
Value = "deductions",
Text = "Deductions",
Group = selectListGroup_Financial
},
new SelectListItem
{
Value = "reimbursements",
Text = "Reimbursements",
Group = selectListGroup_Financial
},
new SelectListItem
{
Value = "accruals",
Text = "Accruals",
Group = selectListGroup_Financial
},
};
// Now add enrollments to list
var enrollments = new StudentChangeHistoryService().GetStudentEnrollment(Id);
foreach (var er in enrollments)
{
if (er.sep_dt.ToString() == "1/1/0001 12:00:00 AM")
{
changeHistorySelect.Add(new SelectListItem
{
Value = er.enr_dt != null ? er.enr_dt.Value.ToString("MM/dd/yyyy") : String.Empty,
Text = "Current Enrollment: " + (er.enr_dt != null ? er.enr_dt.Value.ToString("MM/dd/yyyy") : String.Empty) + " - Current",
Group = selectListGroup_Daily_Status
});
}
else
{
changeHistorySelect.Add(new SelectListItem
{
Value = er.enr_dt != null ? er.enr_dt.Value.ToString("MM/dd/yyyy") : String.Empty,
Text = String.Format("Prior Enrollment: {0} - {1} ", er.enr_dt != null ? er.enr_dt.Value.ToString("MM/dd/yyyy") : String.Empty,(er.sep_dt != null ? er.sep_dt.Value.ToString("MM/dd/yyyy"): String.Empty)),
Group = selectListGroup_Daily_Status
});
}
}
var jsonResult = Json(changeHistorySelect);
#endregion
return Json(changeHistorySelect,JsonRequestBehavior.AllowGet);
}
Now I need to have the UI call and build selector in javascript
function getChangeHistorySelect(studentId) {
$.getJSON('@Url.Action("GetChangeHistorySelect")', { Id: studentId }).done(function (data) {
console.log(data);
var result = data;
var changeHistorySelect = $('#changeHistorySelect');
changeHistorySelect.empty();
var groupName = '';
var groupPreviousName = '';
$.each(result,
function () {
// Need an outloop for the option group
// debugger;
if (this.Group != null) {
// Has the group already been added?
var group = this.Group;
if (groupName === '') {
groupName = group.Name;
groupPreviousName = groupName;
// First Add...
changeHistorySelect.append(
$('<optgroup>',
{
label: groupName,
id: groupName
}));
} else {
groupName = group.Name;
// A group has already been added... does it match?
if (groupPreviousName === groupName) {
// They Match skip (added select under this group
} else {
// They don' match, add new optGroup and contiue on to add selects under it
groupName = group.Name;
groupPreviousName = groupName;
changeHistorySelect.append(
$('<optgroup>',
{
label: groupName,
id: groupName.replace(/\s/g, "")
}));
}
}
// Add Option Group
var custom = $('#' + groupName.replace(/\s/g, ""));
var option = $("<option></option>");
option.val(this.Value);
option.text(this.Text);
option.appendTo(custom);
} else {
changeHistorySelect.append(
$('<option>',
{
value: this.Value
}).text(this.Text)
);
}
});
});
}
.
Like this:
Like Loading...