0

我有两种相同的方法。

我的 [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

我能想到的唯一方法是向我的模型 astartDate和 an添加 2 个属性,endDate并在剃须刀页面上使用这些属性,但尝试查看是否可以在控制器中完成所有工作并保持剃须刀页面清洁。

标准:

必须显示每一个 KPI(即使它没有数据(目前是这样工作的))必须过滤掉不在方法daterange中的项目[HttpPost]

4

4 回答 4

1

要对某个范围内的值求和,只需添加一个 Where 子句:

@item.IPACS_kpiHistory.Where(m => m.date >= Model.MinDate && m.date <= Model.MaxDate)
    .Sum(m => m.startAmount)
于 2013-06-26T21:32:24.790 回答
1

你的方法是错误的。POST 应该只用于将数据发布回服务器。当表单处理是“幂等的”时,应该使用“GET”方法,并且仅在这些情况下。作为简化,我们可以说“GET”基本上只是为了获取(检索)数据,而“POST”可能涉及任何事情,比如存储或更新数据,或订购产品,或发送电子邮件。

为什么不执行以下操作(这种方法将提供一个通用功能来处理所有类型的过滤/搜索等):

  • 使用没有任何参数的 HttpGet => 会给你默认列表
  • 使用带有参数(过滤器)的 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”现在保存您可以解析的查询字符串,并根据过滤器返回正确的列表。

于 2013-06-27T12:47:21.430 回答
1

正如另一张海报所述,您应该将 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>
}
于 2013-06-27T13:49:27.360 回答
0

您可以将您的 post 方法中的 foreach 循环更改为类似这样的内容

foreach (var item in kpi)
{
    if (startdate <= item.date && item.date <= enddate)
    {
        model.IPACS_KPIS.Add(item);
    }
}

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

于 2013-06-26T21:10:49.437 回答