2009-07-28 34 views
1

我創建了一個幫助器,可以傳遞一個DateTime對象和一個標識符(字符串)。然後它會輸出三個選擇顯示DD | MM | YYYY(或者美國人想要約會的任何一種方式)。ASP.NET MVC OnActionExecuting過濾器捕獲特定的表單域並結合

我在每個選擇的名稱的開頭添加了一個公共組件。

  • dateselector - 日 - {標識符}
  • dateselector-月 - {標識符}
  • dateselector-年 - {標識符}

我想要什麼,是設置一個過濾器在站點控制器父節點的「OnActionExecuting」中捕獲所有表單文章,以「dateselector-」開頭的任何字段的skim將三個(日/月/年)字段添加到一個名爲{identifier}的變量中並將其傳遞。

是的,我試圖複製一個Rails助手(date_select)...

回答

1

只是增加阿爾尼斯的前面回答;)使用這樣的事情在你的過濾器:

var Params = filterContext.RequestContext.HttpContext.Request.Params; 

var dateParts = Params.AllKeys 
    .Where(x => x.StartsWith("dateselector-")) 
    .Select(x => new { 
     Id = x.Substring(x.LastIndexOf('-') + 1), 
     Part = x.Remove(x.LastIndexOf('-')).Substring(x.IndexOf('-') + 1), 
     Value = Params[x] 
    }).GroupBy(x => x.Id) 
    .ToDictionary(
     x => x.Key, 
     x => x.ToDictionary(y => y.Part, y => y.Value) 
    ); 

var date = String.Format(
    "{0}-{1}-{2}", 
    dateParts["identifier"]["year"], 
    dateParts["identifier"]["month"], 
    dateParts["identifier"]["day"] 
); 

// UPDATED after comment 
// Params.Add("identifier", date); 

// You can use HttpContext.Items instead: 
filterContext.HttpContext.Items.Add("identifier", date); 
+0

這看起來不錯,但參數是隻讀的,所以我似乎無法添加... – boymc 2009-07-29 04:28:09

1

創建custom action filter

ActionExecutingContext.Params讓你獲取發佈的值。

ActionExecutingContext.ActionParameters允許您設置將傳遞給控制器​​操作的參數

編輯:
如果我沒有記錯,有在CodeCampServer源某些日期時間同治東西。
值得檢查。

編輯2:
是的,歐盟。我的錯誤,我至今仍沉睡在我的代碼沒有注意到這一點:

var request = filterContext.Controller.ControllerContext.HttpContext.Request; 

但我的意思是.Params,不是因爲.FORM包括PARAMS從查詢字符串值了。
HTTP使用GET更方便。

+1

阿爾尼斯,`ActionExecutingContext`沒有`Params`財產。你的意思是`ActionExecutingContext.RequestContext.HttpContext.Request.Form`嗎? – 2009-07-28 07:30:41