Asp.NET MVC ActionFilter无法获取表单提交数据

时间:2010-05-18 07:10:39

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

我想使用自定义动作过滤器来操作一个动作的参数。

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

行动:实际上需要带2个ids;

动作过滤器(onExecuting,将验证输入名称,如果有效,将它们转换为2个ID并替换为routedata)

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

这是代码的一部分:

  1. 路由信息

    routes.MapRoute(             “默认”,//路线名称             “{controller} / {action}”,//带参数的网址             new {controller =“Home”,action =“Index”} //参数默认值         );

    routes.MapRoute(             “RelationshipResults”,//路由名称             “Relationship / {initPersonID} / {targetPersonID}”,//带参数的URL             new {controller =“Relationship”,action =“Results”});

  2. 提交表单(创建2个输入框并通过jquery提交)

    <%using(Html.BeginForm(“Results”,“Relationship”,FormMethod.Post,new {id =“formSearch”}))    {%GT;
       ...

        <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]     公共ActionResult结果(Int64 initPersonID,Int64 targetPersonID)     {...

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

    :(

1 个答案:

答案 0 :(得分:0)

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

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

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