0

jqGrid編集フォームのdataurlから選択リストを埋めるグリッドがあります。これらの値は、getで正常に入力されます。データをjsonとしてプルバックしていますが、選択リストに表示されるアイテムのフィールドIDと名前を含むカスタムタイプのLookupItemがあります。この部分は正常に機能します。たとえば、LookupItemタイプのLocationフィールドを持つスケジュールされたコース(以下の2番目のコード例)を表すオブジェクトモデルがあり、LookupItemにはIdフィールドとNameフィールドがあります。

私の問題は、ActionResultメソッドではこれらのフィールドがサーバーにポストバックされないことです-私はnullを取得しています。custom_func関数を追加し、valueパラメーターが探しているIDを保持していることを確認しましたが、それをActionResultメソッドに送信する方法がわかりません。何か案は?

HTML / jqGridコード:

            $("#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 < 0 || value > 20)
                return [false, "Please enter value between 0 and 20"];
            else
                return [true, ""];
        }

ScheduledCourseのオブジェクトモデル:

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; }
}

コントローラーコード:

        //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);
        }
    }

コントローラでActionResultメソッドが呼び出されたときにサーバーに渡されるパラメータは次のとおりです(http:// localhost:30320 / OrchardLocal / ABC.Admin / CourseAdmin / UpdateScheduledCourse /)-ドット表記が使用されていることに注意してください共有タイプのLookupItemを使用する:

ScheduledCourseDate=07%2F01%2F2011&Location.Name=10016&Time.Name=1014&Cost.Name=1001&Instructor.Name=10001&AdditionalInfo=blahblahblah&oper=edit&id=12126
4

1 に答える 1

1

まず、name列のプロパティを変更して、内部にドットがないようにする必要があります。たとえば、代わりにアンダースコアを使用できます。'Location.Id'さらに、、、'Time.Id'およびが必要かどうかはわかりません'Instructor.Id'。サーバーで必要な場合は、を使用できますname: 'location', jsonmap: 'Location.Name'name: 'scheduledCourseDate', jsonmap: 'ScheduledCourseDate'同じように、の代わりに使用できますname: 'ScheduledCourseDate'

変更後、selectから選択されたIDは、「location」、「time」、および「instructor」という短い名前で投稿されます。UpdateScheduledCourseしたがって、メソッドで名前を使用できます

[HttpPost]
public ActionResult UpdateScheduledCourse(string oper, int id, string scheduledCourseDate,
    string location, string time, string cost, string instructor, string additionalInfo)
于 2012-05-14T06:30:37.877 に答える