This question is locked. New answers and comments are not allowed.
I have a Grid that is using Ajax binding, paging and sorting. If I go to a page besides the first one and try to submit the form there is no Model. If I go back to page one it will submit fine. Submitting works fine after sorting too, but only on the first page. Really stumped on this one ... anyone with an idea on what could be causing this? Generated source looks good weather its paged or not. I have enumeration for each row and its working just fine too.
HTML:
Controller: (includes Get, Ajax and Post)
View Model:
HTML:
<% using (Html.Configurator("") .PostTo("ManageClassProperties", "Administration") .Begin()) %> <% { %> <%: Html.AntiForgeryToken() %> <%: Html.HiddenFor(model => Model.QuarterCode) %> <%: Html.HiddenFor(model => Model.Instructor) %> <%: Html.HiddenFor(model => Model.CourseName) %> <%: Html.HiddenFor(model => Model.RowCount) %> <p> <input type="submit" value="Update Properties" /> <input type="reset" value="Reset" onclick="document.location.href = '<%: Url.Action("ManageClassPropertiesResults", "Administration") %>'" /> </p><% int Iter = 0; Html.Telerik().Grid(Model.SearchResults) .Name("Grid") .TableHtmlAttributes(new { summary = "Manage Class Properties" }) .HtmlAttributes(new { @style = "font-size: .9em; font-family: Arial, Verdana, Helvetica, Sans-Serif; padding-bottom: 0;margin-top:0;" }) .DataBinding(databinding => databinding.Ajax() .Select("_ManageClassPropertiesResults", "Administration", new { quarterCode = Model.QuarterCode, instructor = Model.Instructor, courseName = Model.CourseName })) .DataKeys(key => { key.Add(c=>c.CourseId); key.Add(c=>c.SiteDescription); key.Add(c=>c.ClassTimingCode); }) .Columns(columns => { columns.Bound(model => model.CourseId) .Template(o => {%><input id='SearchResults_<%=Iter%>__CourseId' name='SearchResults[<%=Iter%>].CourseId' type='hidden' value='<%:Model.SearchResults[Iter].CourseId %>' /><% }) .ClientTemplate("<input id='SearchResults_<#= index #>__CourseId' name='SearchResults[<#= index #>].CourseId' type='hidden' value='<#= CourseId #>' />") .Hidden(); columns.Bound(model => model.QuarterName) .Template(o=>o.QuarterName) .ClientTemplate("<#= QuarterName #>") .Title("Quarter") .Width(80); columns.Bound(model => model.CourseName) .Template(o => {%><%: o.ProgramLevelCode %> <%: o.CourseNumber %> <%: o.CourseName %><%}) .ClientTemplate("<#= ProgramLevelCode #> <#= CourseNumber #> <#= CourseName #>") .Title("Class Name"); columns.Bound(model => model.InstructorName) .Template(o => o.InstructorName) .ClientTemplate("<#= InstructorName #>") .Title("Instructor") .Width(180); columns.Bound(model=> model.SiteDescription) .Template(o =>{ %><input id='SearchResults_<%=Iter%>__SiteDescription' maxlength='50' name='SearchResults[<%=Iter%>].SiteDescription' type='text' value='<%: Model.SearchResults[Iter].SiteDescription %>' /><% }) .ClientTemplate("<input id='SearchResults_<#= index #>__SiteDescription' maxlength='50' name='SearchResults[<#= index #>].SiteDescription' type='text' value='<#= SiteDescription #>' />") .HtmlAttributes(new { style = "font-size:.95em;" }) .Title("Site Description") .Sortable(true) .Width(230); columns.Bound(o=>o.ClassTimingCode) .Template(o =>{%><select id="SearchResults_<%= Iter %>__ClassTimingCode" name="SearchResults[<%=Iter%>].ClassTimingCode" class="t-widget t-dropdown t-dropdown-wrap t-state-default" style="font-size: .95em; width: 120px; background-color: #fff;" ><option style = "font-size: .95em; border-color: #cccccc;" value="A" <%: Model.SearchResults[Iter].ClassTimingCode == "A" ? "selected=selected" : String.Empty %> >Afternoon</option><option style = "font-size: .95em; border-color: #cccccc;" value="D" <%: Model.SearchResults[Iter].ClassTimingCode == "D" ? "selected=selected" : String.Empty %> >Day</option><option style = "font-size: .95em; border-color: #cccccc;" value="N" <%: Model.SearchResults[Iter].ClassTimingCode == "N" ? "selected=selected" : String.Empty %> >Night</option></select><%}) .ClientTemplate("<select id='SearchResults_<#= index #>__ClassTimingCode' name='SearchResults[<#= index #>].ClassTimingCode' class='t-widget t-dropdown t-dropdown-wrap t-state-default' style='font-size: .95em; width: 120px; background-color: #fff;' ><option style = 'font-size: .95em; border-color: #cccccc;' value='A' <#= (ClassTimingCode == 'A') ? selected=\"selected\" : '' #> >Afternoon</option><option style = 'font-size: .95em; border-color: #cccccc;' value='D' <#= (ClassTimingCode == 'D') ? selected=\"selected\" : '' #> >Day</option><option style = 'font-size: .95em; border-color: #cccccc;' value='N' <#= (ClassTimingCode == 'N') ? selected=\"selected\" : '' #> >Night</option></select>") .Encoded(true) .Title("Class Timing") .Width(140); columns.Template(o =>{%><% Iter++; %><%}) .ClientTemplate("<#= ++index #>") .Hidden(); }) .Pageable(paging => paging.Style(PagerStyles).PageSize(25, new[] { 5, 10, 15, 25, 50, 200 }).Position(POSITION).Total(%><% Model.RowCount %><%)) .NoRecordsTemplate("<p class='instructions'>No Records Available</p>") .Sortable() .ClientEvents(events => events.OnDataBinding("onDataBinding")) .Render(); %> <p> <input type="submit" value="Update Properties" /> <input type="reset" value="Reset" onclick="document.location.href = '<%: Url.Action("ManageClassPropertiesResults", "Administration") %>'" /> </p><% } %> <p> <%: Html.ActionLink("New Search", "ManageClassPropertiesSearch")%> <%: Html.ActionLink("Return to Administration", "Index")%> </p> <script type="text/javascript"> var index = 0; function onDataBinding() { var grid = $('#Grid').data('tGrid'); index = (grid.currentPage - 1) * grid.pageSize; } </script>Controller: (includes Get, Ajax and Post)
[ExtendedAuthorize(Roles = "DataAccess,SysAdmin")]public ActionResult ManageClassPropertiesResults(string quarterCode, string instructor, string courseName){ var CurrentUser = (AuthenticatedUser)Session["CurrentUser"]; var Model = new ManageCourseSearchResultsViewModel(); Model.QuarterCode = quarterCode; Model.Instructor = instructor; Model.CourseName = courseName; Model.SearchResults = CourseUtil.ManageCourseSearch(LookupUtil.GetCurrentAcademicYearCode(), CurrentUser.ProviderId, quarterCode != "" ? quarterCode : null, instructor != "" ? instructor : null, null, courseName); Model.ClassTimingList = LookupUtil.GetClassTimings(); Model.RowCount = Model.SearchResults.Count; ViewData["Total"] = Model.RowCount; return View("ManageClassPropertiesResults", Model);}[GridAction][ExtendedAuthorize(Roles = "DataAccess,SysAdmin")]public ActionResult _ManageClassPropertiesResults(string quarterCode, string instructor, string courseName){ if (ModelState.IsValid) { ModelState.Clear(); } var CurrentUser = (AuthenticatedUser)Session["CurrentUser"]; var Model = new ManageCourseSearchResultsViewModel(); Model.QuarterCode = quarterCode; Model.Instructor = instructor; Model.CourseName = courseName; Model.SearchResults = CourseUtil.ManageCourseSearch(LookupUtil.GetCurrentAcademicYearCode(), CurrentUser.ProviderId, quarterCode != "" ? quarterCode : null, instructor != "" ? instructor : null, null, courseName); Model.ClassTimingList = LookupUtil.GetClassTimings(); Model.RowCount = Model.SearchResults.Count; return View("ManageClassPropertiesResults", new GridModel{Data = Model.SearchResults, Total = Model.RowCount});}[ExtendedAuthorize(Roles = "DataAccess,SysAdmin")][ValidateAntiForgeryToken][HttpPost]public ActionResult ManageClassProperties(ManageCourseSearchResultsViewModel model){ var CurrentUser = (AuthenticatedUser)Session["CurrentUser"]; if (ModelState.IsValid) { ModelState.Clear(); } if (model.SearchResults != null) { foreach (var Row in model.SearchResults) { var courseId = Row.CourseId; var ValidCourse = new Course(courseId); var course = new Course(); //Set Read-Only fields for the Course course = ValidCourse; course.ClassTimingCode = Row.ClassTimingCode; course.SiteDescription = Row.SiteDescription; //Update Course course.Update(CurrentUser.UserId); } } return RedirectToAction("ManageClassPropertiesResults");}public class ManageCourseSearchResultsViewModel{ [Display(Name = "Academic Year")] [StringLength(7, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 7)] public string AcademicYearCode { get; set; } [Display(Name = "Quarter")] public string QuarterCode { get; set; } [Display(Name = "Quarter")] public string SelectedQuarterName { get; set; } [Display(Name = "Instructor")] [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 0)] public string Instructor { get; set; } [Display(Name = "ClassID")] public int CourseId { get; set; } [Display(Name = "Class")] public string SelectedCourseName { get; set; } [Display(Name = "Class Name")] [StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 0)] public string CourseName { get; set; } public int RowCount { get; set; } [StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 0)] public String SiteDescription { get; set; } public String TimingCode { get; set; } public IEnumerable<SelectListItem> ClassTimingList { get; set; } public Course Course { get; set; } public IList<ManageCourseSearchResult> SearchResults { get; set; } [UIHint("ClassTiming")] public string Code { get; set; }}