HttpGet-HttpPost方法偏差
本文关键字:方法 HttpGet-HttpPost | 更新日期: 2023-09-27 18:20:12
我有两个相同的方法。
我的[HttpGet]方法返回KPI模型的所有数据的列表。
我的[HttpPost]版本需要返回KPI模型的日期范围内的数据列表。
[HttpGet]
public ActionResult ViewDepartment (int id = 0)
{
// populate the IPACS_kpiHistory with all available data in the department
var kpi = model.IPACS_Department.IPACS_Functions.SelectMany(m => m.IPACS_Processes).SelectMany(m => m.IPACS_Procedures).SelectMany(m => m.IPACS_KPIS);
foreach (var item in kpi)
{
model.IPACS_KPIS.Add(item);
}
return View(model);
}
[HttpPost]
public ActionResult ViewDepartment (int id, System.DateTime startDate, system.DateTime endDate)
{
// populate the IPACS_kpiHistory with all available data in the department
var kpi = model.IPACS_Department.IPACS_Functions.SelectMany(m => m.IPACS_Processes).SelectMany(m => m.IPACS_Procedures).SelectMany(m => m.IPACS_KPIS);
foreach (var item in kpi)
{
model.IPACS_KPIS.Add(item);
}
return View(model);
}
在视图页面上,我需要显示每个KPI的列表(在IPACS_KPIS中找到),然后对每个KPI的数据求和(在IPACS_kpiHistory中找到)。
这是我的浏览页面部分:
@foreach (var item in @Model.IPACS_KPIS)
{
<tr class="gradeX">
<td>
@item.name
</td>
<td>
@item.IPACS_kpiHistory.Select(m => m.startAmount).Sum()
</td>
<td>
@item.IPACS_kpiHistory.Select(m => m.completedAmount).Sum()
</td>
<td>
@item.IPACS_kpiHistory.Select(m => m.endAmount).Sum()
</td>
</tr>
}
如何正确筛选[HttpPost]的数据并查找startDate
和endDate
之间的值?
我能想到的唯一方法是在我的模型中添加两个属性——startDate
和endDate
,并在剃刀页面上使用它们,但试着看看是否有可能在控制器中完成所有这些工作,并保持剃刀页面的清洁。
标准:
必须显示每个KPI(即使它没有数据(目前是这样工作的))必须在[HttpPost]
方法中筛选出不在daterange
之间的项。
您的方法是错误的。POST只能用于将数据发布回服务器。当表单处理是"幂等"时,应该使用"GET"方法,并且仅在这些情况下使用。作为简化,我们可以说"GET"基本上只是用于获取(检索)数据,而"POST"可能涉及任何内容,如存储或更新数据、订购产品或发送电子邮件。
为什么不做以下操作(这种方法将提供一种通用功能,可以处理所有类型的过滤/搜索等):
- 使用不带任何params=>的HttpGet将为您提供默认列表
- 使用带有params(filters)=>的HttpGet会给你一个过滤列表
创建自定义过滤器:
public class SearchAttribute : ActionFilterAttribute
{
#region Public Methods and Operators
/// <summary>
/// Overrides method OnActionExecuting, fires before every controller action is executed. Method retrives list search parameters from current url and saves them in
/// SearchParams base controller dictionary.
/// </summary>
/// <param name="filterContext">
/// The filter Context.
/// </param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
foreach (string key in filterContext.HttpContext.Request.QueryString.AllKeys)
{
if ((key != null) && key.StartsWith("f_"))
{
filterContext.Controller.ViewData[key] =
filterContext.HttpContext.Request.QueryString[key].ToLower();
}
}
}
#endregion
}
因此,任何通过Url带有"f_"的内容都将被视为筛选参数。
用您在上面创建的FilterAttribute装饰您的控制器:
[Search]
public ActionResult Index()
{
var qs = this.ControllerContext.RequestContext.HttpContext.Request.QueryString
....
}
"qs"现在保存您可以解析的查询字符串,并根据那里的过滤器返回正确的列表。
要对某个范围内的值求和,只需添加Where子句:
@item.IPACS_kpiHistory.Where(m => m.date >= Model.MinDate && m.date <= Model.MaxDate)
.Sum(m => m.startAmount)
正如另一位海报所说,这两种控制器方法都应该使用Get。这没什么大不了的,但这是正常的惯例。然后你会有一个方法,那就是get,并获取id,开始日期,结束日期。
如果你只使用get或者同时使用get和post,你仍然可以在没有任何逻辑的情况下解决这个问题(因为它不应该存在)。
将开始日期和结束日期添加到模型中。然后在控制器中设置这些属性或变量。然后在模型model上创建一个方法。GetFilteredKPIS()此方法返回模型中开始日期和结束日期之间的所有KPIS。
然后剃须刀就干净了:
@foreach (var item in @Model.GetFilteredKPIS())
{
<tr class="gradeX">
<td>
@item.name
</td>
<td>
@item.IPACS_kpiHistory.Select(m => m.startAmount).Sum()
</td>
<td>
@item.IPACS_kpiHistory.Select(m => m.completedAmount).Sum()
</td>
<td>
@item.IPACS_kpiHistory.Select(m => m.endAmount).Sum()
</td>
</tr>
}
您可以将post方法中的foreach循环更改为类似的内容
foreach (var item in kpi)
{
if (startdate <= item.date && item.date <= enddate)
{
model.IPACS_KPIS.Add(item);
}
}
您必须更改它才能使用对象的相关属性。