Как провести рефакторинг кода jqGrid, от метода контроллера JsonResult, до слабосвязанных моделей?

Я использую пример из Code Project: ASP.NET MVC-4,Entity Framework и JQGrid Demo с простым WebApplication списка Todo. Тем не менее, разработчик не добился максимальной сплоченности, поскольку контроллер выполняет всю бизнес-логику. Я пытаюсь отделить метод JsonResult от контроллера и создать слабо связанные классы, которые обрабатывают всю бизнес-логику из модели.

Вот мой оригинальный код:

[HttpPost]
public JsonResult getPriceTable(string sidx, string sord, int page, int rows)
    {
        int pageIndex = Convert.ToInt32(page) - 1;
        int pageSize = rows;

        var modelPrices = db.VW_MODELS_CHARGEs
            .OrderBy(x => x.SERIAL_CODE)
            .Where(x => x.ACTIVE == 1)
            .Select(x => new { x.VW_MC_OBJID, x.S_MODEL, x.CHARGE, x.SERIAL_CODE });

        int totalRecords = modelPrices.Count();
        var totalPages = (int)Math.Ceiling((float)totalRecords / (float)rows);

        var jsonData = new
        {
            total = totalPages,
            page,
            records = totalRecords,
            rows = modelPrices
        };
        return Json(jsonData, JsonRequestBehavior.AllowGet);
    }

Чтобы начать разбивать логику, в контроллере я создал несколько классов:

public class jqGridTable
{
    public int pageIndex { get; set; }
    public int pageSize { get; set; }
    public int totalRecords { get; set; }
    public int totalPages { get; set; }
    public List<adminPriceTable> modelPricesList = new List<adminPriceTable>();

}

public class adminPriceTable
{
    public int VW_MC_OBJID { get; set; }      
    public string S_MODEL { get; set; }
    public string SERIAL_CODE { get; set; }
    public decimal? CHARGE { get; set; }
}

и затем класс ниже вызывает метод для возврата данных:

public class adminPriceTableList
{
    public static jqGridTable priceTableResult(string sidx, string sord, int page, int rows)
    {
        var jqGrid = new jqGridTable();

        jqGrid.pageIndex = Convert.ToInt32(page) - 1;
        jqGrid.pageSize = rows;

        jqGrid.modelPricesList = NREContext.dbConn.VW_MODELS_CHARGEs
            .OrderBy(x => x.SERIAL_CODE)
            .Where(x => x.ACTIVE == 1)
            .Select(x => new adminPriceTable
            {
                VW_MC_OBJID = x.VW_MC_OBJID,
                SERIAL_CODE = x.SERIAL_CODE,
                S_MODEL = x.S_MODEL,
                CHARGE = x.CHARGE
            }).ToList();

        jqGrid.totalRecords = jqGrid.modelPricesList.Count();
        jqGrid.totalPages = (int)Math.Ceiling((float)jqGrid.totalRecords / (float)rows);

        return jqGrid;
    }
}

так что теперь, в контроллере, я должен иметь возможность вызывать контроллер просто:

[HttpPost]
    public JsonResult getPriceTable(string sidx, string sord, int page, int rows)
    {

        return Json(adminPriceTableList.priceTableResult(sidx, sord,page,rows), JsonRequestBehavior.AllowGet);
    }

Однако jqGrid не заполняется. Я подозреваю, что это как-то связано с (показанным ниже) исходным кодом, когда контроллер обрабатывал всю логику.

var jsonData = new
        {
            total = totalPages,
            page,
            records = totalRecords,
            rows = modelPrices
        };

Может ли кто-нибудь помочь мне понять, что я не правильно сделал? Вы видите, где я ошибся или я не прибегаю к правильным методам?

Благодарю.

1 ответ

Решение

Просмотрев код, я не заметил, что modelPriceList:

public List<adminPriceTable> modelPricesList = new List<adminPriceTable>

должно быть то же имя, что и modelPrices

 var jsonData = new
    {
        total = totalPages,
        page,
        records = totalRecords,
        rows = modelPrices
    };

так после переименования списка....

 public List<adminPriceTable> modelPrices = new List<adminPriceTable>

... дает результаты.

Другие вопросы по тегам