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]的数据并查找startDateendDate之间的值?

我能想到的唯一方法是在我的模型中添加两个属性——startDateendDate,并在剃刀页面上使用它们,但试着看看是否有可能在控制器中完成所有这些工作,并保持剃刀页面的清洁。

标准:

必须显示每个KPI(即使它没有数据(目前是这样工作的))必须在[HttpPost]方法中筛选出不在daterange之间的项。

HttpGet-HttpPost方法偏差

您的方法是错误的。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);
    }
}

您必须更改它才能使用对象的相关属性。