This is a migrated thread and some comments may be shown as answers.

[Solved] Missing Model on Submit after Paging

0 Answers 113 Views
Grid
This is a migrated thread and some comments may be shown as answers.
This question is locked. New answers and comments are not allowed.
Greg
Top achievements
Rank 1
Greg asked on 22 Dec 2011, 07:42 PM
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:
        <% 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");
}
View Model:
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; }
 
}
Tags
Grid
Asked by
Greg
Top achievements
Rank 1
Share this question
or