【问题标题】:Asp.NET MVC ActionFilter cannot get Form Submit dataAsp.NET MVC ActionFilter 无法获取表单提交数据
【发布时间】:2010-05-18 07:10:38
【问题描述】:

我想使用自定义操作过滤器将参数操作到一个操作。

用户输入:一个表单中的 2 个名称;

Action:实际需要取2个id;

Action Filter(onExecuting,将验证输入名称,如果有效,将它们转换为2个id并替换在路由数据中)

因为我不想将验证逻辑放在 Action Controller 中。

这是部分代码:

  1. 路由信息

    routes.MapRoute(
         "Default", // Route name
         "{controller}/{action}", // URL with parameters
         new { controller = "Home", action = "Index"} // Parameter default
    );
    
    routes.MapRoute(
         "RelationshipResults",  // Route Name
         "Relationship/{initPersonID}/{targetPersonID}",  // URL with parameters
         new { controller = "Relationship", action = "Results" }
    );
    
  2. 表单提交(创建2个输入框并通过jquery提交)

    ...
         <td align="left"><%: MvcWeibookWeb.Properties.Resource.Home_InitPersonName%></td>
         <td align="right"> <%= Html.TextBox("initPersonID")%></td>
         <td rowspan="3" valign="top">
             <div id="sinaIntro">
             <%: MvcWeibookWeb.Properties.Resource.Home_SinaIntro %>
             <br />
             <%: MvcWeibookWeb.Properties.Resource.Genearl_PromotionSina %>
             </div>
         </td>
     </tr>
     <tr>
         <td align="left" width="90px"><%: MvcWeibookWeb.Properties.Resource.Home_TargetPersonName%></td>
         <td align="right"><%= Html.TextBox("targetPersonID")%></td>
     </tr>
     <tr>
         <td colspan="2" align="right">
             <a href="#" class="btn-HomeSearch" onclick="$('#formSearch').submit();"><%: MvcWeibookWeb.Properties.Resource.Home_Search%></a>
         </td>
    
  3. 动作过滤器

     public override void OnActionExecuting(ActionExecutingContext filterContext)
     {
         Sina.Searcher searcher = new Sina.Searcher(Sina.Processor.UserNetwork);
         String initPersonName, targetPersonName;
    
         // form submit names, we need to process them and convert them to IDs before it enters the real controller.
         initPersonName = filterContext.RouteData.Values["initPersonID"] as String;
         targetPersonName = filterContext.RouteData.Values["targetPersonID"] as String;
     // do sth to convert it to ids and replace
    
  4. 动作/控制器

     [ValidationActionFilter]
         [HandleError]
         public ActionResult Results( Int64 initPersonID, Int64 targetPersonID)
         { ...
    

我的问题是:在 actionFilter 中,它永远不会获取 2 个参数“initPersonID”和“targetPersonID”,RouteData.Values 不包含这两个键。

【问题讨论】:

    标签: asp.net-mvc-2 form-submit action-filter


    【解决方案1】:

    问题在于,由于您的路线没有 initPersonNametargetPersonName 的任何值,因此它们永远不会出现在您的路线数据中。试试(尽管看起来有点奇怪):

    initPersonName = filterContext.RouteData.Values["initPersonID"] as String;
    targetPersonName = filterContext.RouteData.Values["targetPersonID"] as String;
    

    由于“...ID”是您路线中调用的值,这就是您必须在路线数据中查找的内容。您实际上没有在 url 中包含 ID 的事实是另一回事...

    【讨论】:

    • 感谢 Toms,它不起作用我已经改变了它们(内联更新)
    • 让我纠正一件事,如果我输入 localhost/relationship/name1/name2 它会触发操作过滤器并获取我的值,但如果我通过表单提交,我不会得到它们。
    • 现在事情变得有趣了,如果数据是从表单提交的,我可以通过 filterContext.HttpContext.Request.Form["initPersonID"] 获取表单数据。但我可以使用 initPersonName = filterContext.RouteData.Values["initPersonID"] 作为字符串;如果直接在 URL 中输入名称,则获取字符串。那为什么这两个不团结呢?
    • @Goden:当您从表单提交值时,您根本不会将它们作为路由数据。 Google for ASP.NET MVC Model Binders,你会发现该怎么做。
    • @Goden:如果你愿意,你可以自己联合它们——IEnumerable 有 Linq 扩展。 =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2020-11-24
    • 2013-07-24
    • 1970-01-01
    • 2014-06-09
    相关资源
    最近更新 更多