2013-06-26 140 views
0

我有兩個相同的方法。HttpGet HttpPost方法偏差

我的[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之間的值?

我能想到的唯一方法是在我的模型中添加2個屬性startDateendDate並使用剃鬚刀頁面上的這些屬性,但試圖查看是否有可能在控制器中完成所有工作並保留剃鬚刀頁面乾淨。

標準:

必須顯示每一個KPI(即使沒有數據(目前是這樣的)) 必須過濾掉不daterange之間的項目在[HttpPost]方法。

+0

如果您不需要其他KPI的,你可以添加一個WHERE(M => m.Date ...)到以VAR KPI開頭的行= –

+0

@NickBray很遺憾,我必須顯示kpiHistory表中包含項目的KPI,以及kpiHistory表中還沒有條目的KPI。 –

回答

1

你的做法是錯誤的。 POST應該只用於將數據發回服務器。當表單處理是「冪等」時,應該使用「GET」方法,並且僅在這些情況下。作爲一種簡化,我們可以說「GET」基本上只是用於獲取(檢索)數據,而「POST」可能涉及任何內容,如存儲或更新數據,訂購產品或發送電子郵件。

爲什麼不這樣做以下(這種做法會給一個通用的功能,需要所有類型的過濾照顧/搜索等):

  • 使用HTTPGET沒有任何PARAMS =>會給你默認列表
  • 使用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」現在握着你的查詢字符串,你可以解析,並根據過濾器有你返回正確的列表。

+0

我確定這個功能完美,但對我來說實施起來似乎有點困難。我還很新,有幾件事我不熟悉。我會努力嘗試,但必須做一些學習,這絕不是壞事。 :) –

0

在您發佈的方法是這樣的

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

你將不得不改變,使其能夠使用對象的相關屬性你可以改變你的foreach循環。

+0

如果我沒有弄錯,這隻會添加在kpiHistory表中有條目的項目嗎?我需要它顯示每個KPI(KPI表中的每一行),然後對於post方法,我仍然需要顯示每個KPI,但是按日期過濾掉kpihistory中的數據。 –

+0

因此,例如我的KPI表格列出了40個不同的KPI。我的kpiHistory表格顯示了每個KPI的所有數據。我總結這些數據並在我的視圖頁面上顯示。如果KPI在kpihistory表中沒有完成任何工作,我仍然需要顯示它,如果它已經完成了工作,我只需要總結日期之間的數據。認爲這是措辭更好。 –

+0

@JamesWilson你的問題缺少了很多相關的代碼和信息。首先,你有一些模型對象,我們不知道它是如何創建的,甚至不知道它是如何創建的。其次,我不知道KPI是什麼,KPI歷史是什麼,或者這些東西是如何從數據庫中傳出來的,等等。如果沒有這些信息,我們所能做的只是猜測如何爲您提供幫助。請編輯您的問題以添加更多詳細信息。 – Becuzz

1

要在一定範圍內的值相加,只需添加一個WHERE子句:

@item.IPACS_kpiHistory.Where(m => m.date >= Model.MinDate && m.date <= Model.MaxDate) 
    .Sum(m => m.startAmount) 
+0

我試過了,它現在沒有返回數據。這是奇怪的,因爲有數據,但是當我試圖通過數據過濾它時,根據頁面沒有任何東西存在。 –

1

正如另一張海報所述,您應該使用這兩種控制器方法的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> 
}