【问题标题】:ASP.NET MVC OnActionExecuting filter to capture specific form fields and combineASP.NET MVC OnActionExecuting 过滤器捕获特定表单字段并组合
【发布时间】:2010-11-14 14:36:23
【问题描述】:

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

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

  • dateselector-day-{标识符}
  • dateselector-month-{identifier}
  • 日期选择器-年-{标识符}

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

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

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    创建一个custom action filter。

    ActionExecutingContext.Params 允许您获取发布的值。

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

    编辑:
    如果我没记错的话,CodeCampServer 源中有一些日期时间管理的东西。
    可能值得检查。

    EDIT2:
    是的,尤金尼。我的错误,我仍然有点困,并没有在我的代码中注意到这一点:

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

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

    【讨论】:

    • Arnis,ActionExecutingContext 没有 Params 属性。你的意思是ActionExecutingContext.RequestContext.HttpContext.Request.Form?
    【解决方案2】:

    只是添加到 Arnis 的答案 ;) 在你的过滤器中使用类似这样的东西:

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

    【讨论】:

    • 似乎没有,最终不得不在表单中使用 JQuery,因为截止日期迫在眉睫......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-05
    • 1970-01-01
    相关资源
    最近更新 更多