2010-05-18 5 views
1

사용자 지정 작업 필터를 사용하여 한 동작에 대한 매개 변수를 조작하고 싶습니다.Asp.NET MVC ActionFilter가 폼 제출 데이터를 가져올 수 없습니다.

사용자 입력 : 양식에 2 개의 이름;

액션 : 실제로 2 개의 ID를 사용해야합니다.

액션 필터 (onExecuting는, 입력 이름을 확인하고 유효한 경우,이 식별자로 변환하고으로 RouteData에서 대체합니다) 내가 액션 컨트롤러에 유효성 검사 논리를 넣어 싶지 않기 때문에

합니다.

  1. 라우팅 정보

    routes.MapRoute ( "기본", // 경로 이름 "{컨트롤러}/{동작}", // URL :

    여기에 코드의 일부 매개 변수가있는 경우 new {controller = "Home", action = "Index"} // 매개 변수 기본값 );

    routes.MapRoute ( "RelationshipResults", // 경로 이름 "관계/{initPersonID}/{targetPersonID}", // 매개 변수를 URL 새로운 {컨트롤러 = "관계"행동 = "결과"});

  2. 양식 제출

    <퍼센트 사용 (Html.BeginForm ("결과", "관계"FormMethod.Post 새로운 {ID = "formSearch"(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. ,
  5. 액션/컨트롤러

    [ValidationActionFilter] [는 handleError] 공공 ActionResult 결과 (INT64 initPersonID, INT64 targetPersonID) {...

내 문제가없는 다음 actionFilter에서, 그것은 결코 2 개 매개 변수 "initPersonID"와 "targetPersonID"는 RouteData.Values는 ...이 두 키를 포함하지 않는

을 :(얻을 수

답변

0

문제는 귀하의 경로가 initPersonNametargetPersonName에 대한 값이 없으므로 라우트 데이터에 절대로 도달하지 않는다는 것입니다. (이것은 이상한 조금 보이는에도 불구하고) 시도 : 이후

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

을 ... "ID"당신의 경로에서 호출 된 값, 즉 당신이 당신의 경로 데이터를 찾기 위해 무엇을 무엇 whas. 실제로 ID에 URL을 포함시키지 않고 있다는 사실은 또 다른 문제입니다.톰스, 그것은 작동하지 않습니다

+0

감사 내가 – Goden

+0

하자 그들 (업데이트 인라인을) 변경 한 날 올바른 1 일, 난 HTTP를 입력하면 : // localhost를/관계/이름 1/NAME2 는 동작을 트리거 않습니다 필터를 적용하고 값을 가져 오지 만 양식을 통해 제출하면 양식이 표시되지 않습니다. – Goden

+0

지금부터는 흥미로운 일이 있습니다. 폼에서 데이터를 제출하면 filterContext.HttpContext.Request.Form [ "initPersonID"]에 의해 폼 데이터를 얻을 수 있습니다. 하지만 initPersonName = filterContext.RouteData.Values ​​[ "initPersonID"]를 String으로 사용할 수 있습니다. URL에 직접 이름을 입력하면 문자열을 가져옵니다. 왜이 두 사람이 연합하지 않았습니까? – Goden

관련 문제