2009-07-28 73 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