如何重构 jqGrid 代码,从控制器的 JsonResult 方法到松耦合模型?
How to refactor jqGrid code, from controller's JsonResult method, to loosely coupled models?
我正在使用 Code Project: ASP.NET MVC-4,Entity Framework and JQGrid Demo with simple Todo List WebApplication 中的示例。然而,开发人员并没有最大化凝聚力,因为控制器正在处理所有的业务逻辑。我正在尝试将 JsonResult 方法与控制器分离,并创建松散耦合的 classes 来处理模型中的所有业务逻辑。
这是我的原始代码:
[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);
}
为了开始分解逻辑,在控制器中,我创建了几个 classes:
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; }
}
然后下面的 class 调用方法 return 数据:
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
};
有人可以帮助我理解我做错了什么吗?你看到我哪里出错了或者我没有调用正确的方法吗?
谢谢。
查看代码后,我没有注意到 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>
...产生结果。
我正在使用 Code Project: ASP.NET MVC-4,Entity Framework and JQGrid Demo with simple Todo List WebApplication 中的示例。然而,开发人员并没有最大化凝聚力,因为控制器正在处理所有的业务逻辑。我正在尝试将 JsonResult 方法与控制器分离,并创建松散耦合的 classes 来处理模型中的所有业务逻辑。
这是我的原始代码:
[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);
}
为了开始分解逻辑,在控制器中,我创建了几个 classes:
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; }
}
然后下面的 class 调用方法 return 数据:
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
};
有人可以帮助我理解我做错了什么吗?你看到我哪里出错了或者我没有调用正确的方法吗?
谢谢。
查看代码后,我没有注意到 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>
...产生结果。