ASP.NET MVC OnActionExecuting过滤器捕获特定的表单字段并组合

时间:2009-07-28 07:16:41

标签: c# asp.net-mvc

我创建了一个帮助程序,我可以将DateTime对象传递给它,以及一个标识符(字符串)。然后它会输出三个显示DD |的选择MM | YYYY(或者说你古怪的美国人想要你约会的那种方式)。

我在每个选择名称的开头添加一个公共组件。

  • dateselector - 日 - {标识符}
  • dateselector-月 - {标识符}
  • dateselector-年 - {标识符}

我想要的是在网站控制器父级的“OnActionExecuting”上设置过滤器以捕获所有表单帖子,浏览以“dateselector-”开头的任何字段添加三个(日/月/年)将字段转换为一个名为{identifier}的变量并将其传递给它。

是的,我正在尝试复制Rails助手(date_select)......

2 个答案:

答案 0 :(得分:1)

创建custom action filter

ActionExecutingContext.Params可让您获取发布的值。

ActionExecutingContext.ActionParameters允许您设置参数
将传递给控制器​​动作。

修改
如果我没记错的话,CodeCampServer来源中有一些日期时间管理内容 可能值得一试。

<强> EDIT2:
是的,eu-ge-ne。我的错误,我仍然很困,在我的代码中没有注意到这一点:

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

但我的意思是.Params,而不是.Form,因为Params也包含来自查询字符串的值 如果HTTP使用GET,则更方便。

答案 1 :(得分:1)

添加到Arnis的anwer;)在你的过滤器中使用这样的东西:

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);