title: How do I get values returned in jqGrid editmode for select control in an asp.net mvc site?
body: <p>I have a grid that fills select lists from a dataurl in the jqGrid edit form.  These values populate successfully on the get.  I am pulling back my data as json and there is a custom type of LookupItem w/fields Id and Name for the items that show in the select list - this part works fine.  For example I have an object model representing a scheduled course (in 2nd code example below) which has a Location field which is of type LookupItem, and LookupItem has Id and Name fields. </p>
  
  <p>My issue is that these fields are not posting back to the server though in my ActionResult method - i am getting null.  I added a custom_func function and have verified that the value parameter holds the Id that I am looking for, but I'm not sure how to get that posted to the ActionResult method. Any ideas?</p>
  
  <p>HTML/jqGrid code:</p>
  
  <pre><code>            $("#grid").jqGrid({
              url: 'ABC.Admin/CourseAdmin/GetScheduledCourses/',
              datatype: 'json',
              jsonReader: { repeatitems: false },
              mtype: 'GET',
              colNames: ['Id', 'Date', 'LocationId', 'Location', 'TimeId', 'Time', 'CostId', 'Cost', 'InstructorId', 'Instructor', 'Additional Info'],
              colModel: [
                { name: 'ScheduledCourseId', index: 'ScheduledCourseId', width: 40, key: true, hidden: true },
                { name: 'ScheduledCourseDate', index: 'ScheduledCourseDate', width: 50, editable: true },
                { name: 'Location.Id', index: 'Location.Id', width: 25, editable: false, hidden: true },
                { name: 'Location.Name', index: 'Location.Name', width: 150, editable: true, edittype: 'select',
                    editoptions: {
                        dataUrl: 'ABC.Admin/CourseAdmin/GetLookupItems?lookupType=locations',
                        buildSelect: createSelectList
                    },
                    editrules: {
                      custom: true, 
                      custom_func: locationCheck
                    }
  
                },
                { name: 'Time.Id', index: 'Time.Id', width: 25, editable: false, hidden: true },
                { name: 'Time.Name', index: 'Time.Name', width: 50, editable: true, edittype: 'select',
                    editoptions: {
                        dataUrl: 'ABC.Admin/CourseAdmin/GetLookupItems?lookupType=times',
                        buildSelect: createSelectList
                    }
                },
                { name: 'Cost.Id', index: 'Cost.Id', width: 25, editable: false, hidden: true },
                { name: 'Cost.Name', index: 'Cost.Name', width: 50, editable: true, edittype: 'select',
                    editoptions: {
                      dataUrl: 'ABC.Admin/CourseAdmin/GetLookupItems?lookupType=costs',
                      buildSelect: createSelectList 
                    }
                },
                { name: 'Instructor.Id', index: 'Instructor.Id', width: 25, editable: false, hidden: true },
                { name: 'Instructor.Name', index: 'Instructor.Name', width: 100, editable: true, edittype: 'select',
                    editoptions: {
                        dataUrl: 'ABC.Admin/CourseAdmin/GetLookupItems?lookupType=instructors',
                        buildSelect: createSelectList                      
                        }
                },
                { name: 'AdditionalInfo', index: 'AdditionalInfo', width: 200, editable: true, edittype: 'textarea',
                    editoptions: {
                        rows: "6", 
                        cols: "40"
                    } 
                },
              ],
              pager: jQuery('#pager'),
              rowNum: 20,
              sortname: 'Date',
              sortorder: "asc",
              viewrecords: true,
              caption: 'Scheduled Courses',
              height: 400,
              loadonce: true, // needs to be true for client side paging to work
              autowidth: true,
              loadtext: 'Loading...'
          })
          $("#grid").jqGrid('navGrid', '#pager', { edit: true, add: true, del: true },
              { /* edit options */
                  url: 'ABC.Admin/CourseAdmin/UpdateScheduledCourse/',
                  closeOnEscape: true,
                  closeAfterEdit: true,
                  width: 450
              },
              { /* add options */
                  url: 'ABC.Admin/CourseAdmin/CreateScheduledCourse/',
                  closeOnEscape: true,
                  closeAfterAdd: true
              },
              { /* delete options */
                  url: 'ABC.Admin/CourseAdmin/DeleteScheduledCourse/',
                  closeOnEscape: true
              }
          );
  
      });
  
          function locationCheck(value, colname) {
              debugger;
              if (value &lt; 0 || value &gt; 20)
                  return [false, "Please enter value between 0 and 20"];
              else
                  return [true, ""];
          }
  </code></pre>
  
  <p>Object Model for ScheduledCourse:</p>
  
  <pre><code>public class ScheduledCourse
      {
          public ScheduledCourse() { }
      //for admin scheduled course page
      public ScheduledCourse(int scheduledCourseId, string scheduledCourseDate, int locationId, string locationName,
          int timeId, string timeName, int costId, string costName, int instructorId, string instructorName, string additionalInfo)
      {
          this.ScheduledCourseId = scheduledCourseId;
          this.ScheduledCourseDate = scheduledCourseDate;
          this.Location = new LookupItem(locationId, locationName);
          this.Time = new LookupItem(timeId, timeName);
          this.Cost = new LookupItem(costId, costName);
          this.Instructor = new LookupItem(instructorId, instructorName);
          this.AdditionalInfo = additionalInfo;
      }
  
      public int ScheduledCourseId { get; set; }
      public string ScheduledCourseDate { get; set; }
      public LookupItem Location { get; set; }
      public LookupItem Time { get; set; }
      public LookupItem Cost { get; set; }
      public LookupItem Instructor { get; set; }
      public string UserName { get; set; }
      public string AdditionalInfo { get; set; }
  }
  public class LookupItem
  {
      public LookupItem(int id, string name)
      {
          this.Id = id;
          this.Name = name;
      }
  
      public int Id { get; set; }
      public string Name { get; set; }
  }
  </code></pre>
  
  <p>Controller code:</p>
  
  <pre><code>        //colNames: ['Id', 'Date', 'LocationId', 'Location', 'TimeId', 'Time', 'CostId', 'Cost', 'InstructorId', 'Instructor', 'Additional Info'],
      [HttpPost]
      public ActionResult UpdateScheduledCourse(string oper, int id, string scheduledCourseDate, string location, string locationId, string timeId, 
          string timeName, string costId, string costName, string instructorId, string instructorName, string additionalInfo)
      {
          Models.ScheduledCourseProvider p = new Models.ScheduledCourseProvider();
  
          //Models.ScheduledCourse o = new Models.ScheduledCourse(
          //    id, scheduledCourseDate, Convert.ToInt32(locationId), locationName, Convert.ToInt32(timeId), timeName, Convert.ToInt32(costId), 
          //    costName, Convert.ToInt32(instructorId), instructorName, additionalInfo);
  
          //bool saved = p.UpdateScheduledCourse(o);
  
          bool saved = false;
          if (!saved)
          {
              Response.StatusCode = 500;
              return Content("Record not saved!");
          }
          else
          {
              return Json(false);
          }
      }
  </code></pre>
  
  <p>Here are the params that are being passed to the server when the ActionResult method is called in the controller (http://localhost:30320/OrchardLocal/ABC.Admin/CourseAdmin/UpdateScheduledCourse/) - notice the dot notation being used because I am using a shared type of LookupItem:</p>
  
  <pre><code>ScheduledCourseDate=07%2F01%2F2011&amp;Location.Name=10016&amp;Time.Name=1014&amp;Cost.Name=1001&amp;Instructor.Name=10001&amp;AdditionalInfo=blahblahblah&amp;oper=edit&amp;id=12126
  </code></pre>