2010-05-18 11 views
1

Je souhaite utiliser un filtre d'action personnalisé pour manipuler les paramètres d'une action.Asp.NET MVC ActionFilter impossible d'obtenir le formulaire Soumettre des données

Entrées utilisateur: 2 noms dans un formulaire;

Action: nécessite en fait 2 identifiants;

Filtre d'action (onExecuting, vérifiera les noms d'entrée et si elle est valide, les convertir en 2 cartes d'identité et remplacer dans le RouteData)

parce que je ne veux pas mettre la logique de validation dans le contrôleur d'action.

est ici une partie du code:

  1. Informations sur le routage

    routes.MapRoute ( "par défaut", // Nom de la route "{contrôleur}/{action}", // URL avec les paramètres new {controller = "Home", action = "Index"} // Paramètre par défaut );

    routes.MapRoute ( "RelationshipResults", // Nom de la route "relation/{initPersonID}/{} targetPersonID", // URL avec des paramètres nouveau {controller = "Relation", action = "Résultats"})

  2. formulaire pour soumettre (2 Créer boîte d'entrée et envoyer par jquery)

    <% en utilisant (Html.BeginForm ("Résultats", "relation", FormMethod.Post, nouveau {id = "formulaireRecherche" })) { %>
    ...

    <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. action Filtre

    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. Action/Contrôleur

    [ValidationActionFilter] [HandleError] Résultats ActionResult publique (Int64 initPersonID, Int64 targetPersonID) {...

Mon problème est: dans le ActionFilter, il n'a jamais obtient les 2 paramètres "initPersonID" et "targetPersonID", les RouteData.Values ​​ne contiennent pas ces 2 clés ...

:(

Répondre

0

Le problème est que puisque vos itinéraires n'ont aucune valeur pour initPersonName et targetPersonName, ils ne finissent jamais dans vos données de route. Essayez (même si elle semble un peu bizarre):

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

Depuis « ... ID » whas ce que les valeurs où appelées dans vos itinéraires, c'est ce que vous devez rechercher dans vos données d'itinéraire. Le fait que vous n'incluez pas les ID dans l'url est une autre affaire ...

+0

grâce Toms, il ne fonctionne pas je les ai changé (en ligne mis à jour) – Goden

+0

me laisser correcte 1 chose, si je tape http: // localhost/relation/nom1/nom2 ne déclenche l'action filtrer et obtenir mes valeurs, mais si je soumets à travers le formulaire, je ne les obtiens pas. – Goden

+0

Maintenant, les choses deviennent intéressantes, je peux obtenir les données de formulaire par filterContext.HttpContext.Request.Form ["initPersonID"] si les données soumises à partir du formulaire. mais je peux utiliser initPersonName = filterContext.RouteData.Values ​​["initPersonID"] as String; pour obtenir la chaîne si vous tapez directement le nom dans l'URL. alors pourquoi ces 2 ne sont pas unis? – Goden