C# 使用ViewModel类的Jqgrid主详细信息提交表单

C# 使用ViewModel类的Jqgrid主详细信息提交表单,c#,jquery,asp.net-mvc,jqgrid,C#,Jquery,Asp.net Mvc,Jqgrid,我有一个asp.net MVC查看页面,它是主/详细样式。 在阅读之后,我意识到我需要在发送到控制器层之前序列化jqgrid数据 [HttpPost] public ActionResult Detail(Seminar Seminar, List<Seminar_Detail> Seminar_Details) { } 控制器层代码 public class SeminarController : Controller { ISeminarListDetailRepositor

我有一个asp.net MVC查看页面,它是主/详细样式。
在阅读之后,我意识到我需要在发送到控制器层之前序列化jqgrid数据

[HttpPost]
public ActionResult Detail(Seminar Seminar, List<Seminar_Detail> Seminar_Details)
{

}
控制器层代码
public class SeminarController : Controller
{
ISeminarListDetailRepository seminarRepository;

//
// Dependency Injection enabled constructors

public SeminarController()
    : this(new  SeminarListDetailRepository()) {
}

public SeminarController(ISeminarListDetailRepository repository)
{
    seminarRepository = repository;
}

/// <summary>
/// Just for Listing page.
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
    return View();
}

/// <summary>
/// Master Detail CRUD form according to previous form's choosen code.
/// </summary>
/// <param name="Seminar_Code"></param>
/// <returns></returns>
public ActionResult DetailByCode(string Seminar_Code)
{
    return View();
}

/// <summary>
/// Master Detail CRUD form.
/// </summary>
/// <returns></returns>
public ActionResult Detail()
{
    var SeminarListDetailViewModel = new SeminarListDetailViewModel();
    return View(SeminarListDetailViewModel);
}

/// <summary>
/// It is this method what I really focus when it comes to save all rows of jqgrid at once.
/// </summary>
/// <param name="Seminar"></param>
/// <param name="Seminar_Details"></param>
/// <returns></returns>
[HttpPost]
public ActionResult Detail(Seminar Seminar, List<Seminar_Detail> Seminar_Details)
{            
    return View();
}       


/// <summary>
/// Just for test purpose only.
/// I will not use this method when I know how to save JQGrid's All Rows at once.
/// </summary>
/// <param name="Seminar_Detail"></param>
/// <returns></returns>
public ActionResult MyEdit(Seminar_Detail Seminar_Detail)
{
    //var seminar_Code = Seminar_Detail.Seminar_Code;
    var jsonData = new
    {

    };
    return Json(jsonData, JsonRequestBehavior.AllowGet);
}

public ActionResult GetAllSpeakers()
{
    string AllSpeakers = " : ;";
    var Speakers = seminarRepository.GetAllSpeakerList().Seminar_Item_Speaker;
    for (int i = 0; i < Speakers.Count; i++)
    {
        if (i == Speakers.Count - 1)
        {
            ///For the last row
            AllSpeakers += Speakers[i].SpeakerID + ":" + Speakers[i].SpeakerName;
        }
        else
        {
            AllSpeakers += Speakers[i].SpeakerID + ":" + Speakers[i].SpeakerName + ";";
        }

    }   
    return Json(AllSpeakers, JsonRequestBehavior.AllowGet);
}

public JsonResult GetAllTags()
{   
    string AllTags = " : ;";
    var Tags = seminarRepository.GetAllTagList().Seminar_Item_Tag;
    for (int i = 0; i < Tags.Count; i++)
    {
        if (i == Tags.Count - 1)
        {
            ///For the last row
            AllTags += Tags[i].TagID + ":" + Tags[i].TagName;
        }
        else
        {
            AllTags += Tags[i].TagID + ":" + Tags[i].TagName + ";";
        }

    }   
    return Json(AllTags, JsonRequestBehavior.AllowGet);
}

public ActionResult DetailGridData(string sidx, string sord, int page, int rows)
{
    int currentPage = Convert.ToInt32(page) - 1;
    int totalRecords = 0;

    var SeminarList = seminarRepository.GetSeminarDetail("CMP04").Seminar_Detail; //OrderBy(x => x.Seminar_Code).Skip(page * rows).Take(rows).ToList();

    var totalPages = (int)Math.Ceiling(totalRecords / (float)rows);
    var jsonData = new
    {
        total = totalPages,
        page,
        records = totalRecords,

        rows = (
                   from s in SeminarList
                   select new
                   {
                       id = s.Seminar_Code + "__" + s.SpeakerID + "__" + s.TagID,
                       cell = new object[]
                                        {
                                            s.Seminar_Code,
                                            s.SpeakerID,
                                            s.TagID,
                                            s.DateAndTime
                                        }
                   }).ToArray()
    };
    return Json(jsonData, JsonRequestBehavior.AllowGet);
}

public ActionResult ListingGridData(string sidx, string sord, int page, int rows)
{
    int currentPage = Convert.ToInt32(page) - 1;
    int totalRecords = 0;

    var SeminarList = seminarRepository.AllSeminarList().Seminar_Masters; //OrderBy(x => x.Seminar_Code).Skip(page * rows).Take(rows).ToList();

    var totalPages = (int)Math.Ceiling(totalRecords / (float)rows);
    var jsonData = new
    {
        total = totalPages,
        page,
        records = totalRecords,

        rows = (
                   from s in SeminarList
                   select new
                   {
                       id = s.Seminar_Code,
                       cell = new object[]
                                        {
                                            s.Seminar_Code,
                                            s.Title,
                                            s.Description,
                                            s.Room
                                        }
                   }).ToArray()
    };
    return Json(jsonData, JsonRequestBehavior.AllowGet);
}
}

每一条建议都将不胜感激。

关于jqGrid代码的更多细节将澄清一些问题。例如,网格中哪些列是可编辑的?您是否使用
multiselect:true
?我不完全理解你的要求。为什么需要从jqGrid向控制器发送服务器已经拥有的数据?通常只需要发送主网格的
id
,详细网格的
id
,以及详细网格中所有可编辑字段的值。您可以通过ids获得查看模型(
Seminar
seminardeail
)的完整信息。您知道如何发送提交详细表格的maser的
id
?很抱歉,我的问题不太清楚。所以我修改了它。请再看看我的问题。Thank@Oleg,我假设通过查看我更新的问题,您将知道网格中的哪些列是可编辑的。到目前为止,我还没有使用过
multiselect:true
。但可能以后我会需要它。@Oleg,你问我为什么需要从jqGrid向控制器发送服务器已经拥有的数据。因为,根据我的业务需求,我的所有新+更新数据(仅在客户端站点更新)只有在用户单击“提交”按钮时才能保存。这意味着,如果用户不单击jqgrid之外的“提交”按钮,就不会有数据发送到服务器。@Oleg,恕我直言,我是jqgrid和asp.net MVC的新手。所以我不知道你的问题的答案。你知道如何发送提交细节网格的maser的id吗?
public class SeminarController : Controller
{
ISeminarListDetailRepository seminarRepository;

//
// Dependency Injection enabled constructors

public SeminarController()
    : this(new  SeminarListDetailRepository()) {
}

public SeminarController(ISeminarListDetailRepository repository)
{
    seminarRepository = repository;
}

/// <summary>
/// Just for Listing page.
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
    return View();
}

/// <summary>
/// Master Detail CRUD form according to previous form's choosen code.
/// </summary>
/// <param name="Seminar_Code"></param>
/// <returns></returns>
public ActionResult DetailByCode(string Seminar_Code)
{
    return View();
}

/// <summary>
/// Master Detail CRUD form.
/// </summary>
/// <returns></returns>
public ActionResult Detail()
{
    var SeminarListDetailViewModel = new SeminarListDetailViewModel();
    return View(SeminarListDetailViewModel);
}

/// <summary>
/// It is this method what I really focus when it comes to save all rows of jqgrid at once.
/// </summary>
/// <param name="Seminar"></param>
/// <param name="Seminar_Details"></param>
/// <returns></returns>
[HttpPost]
public ActionResult Detail(Seminar Seminar, List<Seminar_Detail> Seminar_Details)
{            
    return View();
}       


/// <summary>
/// Just for test purpose only.
/// I will not use this method when I know how to save JQGrid's All Rows at once.
/// </summary>
/// <param name="Seminar_Detail"></param>
/// <returns></returns>
public ActionResult MyEdit(Seminar_Detail Seminar_Detail)
{
    //var seminar_Code = Seminar_Detail.Seminar_Code;
    var jsonData = new
    {

    };
    return Json(jsonData, JsonRequestBehavior.AllowGet);
}

public ActionResult GetAllSpeakers()
{
    string AllSpeakers = " : ;";
    var Speakers = seminarRepository.GetAllSpeakerList().Seminar_Item_Speaker;
    for (int i = 0; i < Speakers.Count; i++)
    {
        if (i == Speakers.Count - 1)
        {
            ///For the last row
            AllSpeakers += Speakers[i].SpeakerID + ":" + Speakers[i].SpeakerName;
        }
        else
        {
            AllSpeakers += Speakers[i].SpeakerID + ":" + Speakers[i].SpeakerName + ";";
        }

    }   
    return Json(AllSpeakers, JsonRequestBehavior.AllowGet);
}

public JsonResult GetAllTags()
{   
    string AllTags = " : ;";
    var Tags = seminarRepository.GetAllTagList().Seminar_Item_Tag;
    for (int i = 0; i < Tags.Count; i++)
    {
        if (i == Tags.Count - 1)
        {
            ///For the last row
            AllTags += Tags[i].TagID + ":" + Tags[i].TagName;
        }
        else
        {
            AllTags += Tags[i].TagID + ":" + Tags[i].TagName + ";";
        }

    }   
    return Json(AllTags, JsonRequestBehavior.AllowGet);
}

public ActionResult DetailGridData(string sidx, string sord, int page, int rows)
{
    int currentPage = Convert.ToInt32(page) - 1;
    int totalRecords = 0;

    var SeminarList = seminarRepository.GetSeminarDetail("CMP04").Seminar_Detail; //OrderBy(x => x.Seminar_Code).Skip(page * rows).Take(rows).ToList();

    var totalPages = (int)Math.Ceiling(totalRecords / (float)rows);
    var jsonData = new
    {
        total = totalPages,
        page,
        records = totalRecords,

        rows = (
                   from s in SeminarList
                   select new
                   {
                       id = s.Seminar_Code + "__" + s.SpeakerID + "__" + s.TagID,
                       cell = new object[]
                                        {
                                            s.Seminar_Code,
                                            s.SpeakerID,
                                            s.TagID,
                                            s.DateAndTime
                                        }
                   }).ToArray()
    };
    return Json(jsonData, JsonRequestBehavior.AllowGet);
}

public ActionResult ListingGridData(string sidx, string sord, int page, int rows)
{
    int currentPage = Convert.ToInt32(page) - 1;
    int totalRecords = 0;

    var SeminarList = seminarRepository.AllSeminarList().Seminar_Masters; //OrderBy(x => x.Seminar_Code).Skip(page * rows).Take(rows).ToList();

    var totalPages = (int)Math.Ceiling(totalRecords / (float)rows);
    var jsonData = new
    {
        total = totalPages,
        page,
        records = totalRecords,

        rows = (
                   from s in SeminarList
                   select new
                   {
                       id = s.Seminar_Code,
                       cell = new object[]
                                        {
                                            s.Seminar_Code,
                                            s.Title,
                                            s.Description,
                                            s.Room
                                        }
                   }).ToArray()
    };
    return Json(jsonData, JsonRequestBehavior.AllowGet);
}
}
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Seminar List</h2>

<table id="list" class="scroll" cellpadding="0" cellspacing="0"></table>
<div id="pager" class="scroll" style="text-align:center;"></div>
@Html.ActionLink("Click here", "Detail") to add new data.

<script type="text/javascript">
jQuery(document).ready(function () {        
    jQuery("#list").jqGrid({
        url: '/Seminar/ListingGridData/',
        editurl: "/Seminar/MyEdit/",
        datatype: 'json',
        mtype: 'GET',
        colNames: ['Seminar_Code', 'Title', 'Description', 'Room'],
        colModel: [
                      { name: 'Seminar_Code', index: 'Seminar_Code', width: 40, align: 'left', editable: false },
                      { name: 'Title', index: 'Title', width: 40, align: 'left', editable: false },
                      { name: 'Description', index: 'Description', width: 40, align: 'left', editable: false },
                      { name: 'Room', index: 'Room', width: 40, align: 'left', editable: false }
                  ],
        pager: jQuery('#pager'),
        rowNum: 10,
        rowList: [5, 10, 20, 50],
        sortname: 'Title',
        sortorder: "asc",
        viewrecords: true,
        autowidth: true,
        autoheight: true,            
        caption: 'Seminar List - Grid'
    })
}); 
</script>