2010-04-13 7 views
0

En C#, comment transmettre les objets Session [] et Request [] à une méthode?Passer la session [] et la demande [] aux méthodes en C#

Je voudrais utiliser une méthode pour analyser les paramètres de session et de requête pour une page .aspx afin de réduire la taille de ma méthode Page_Load. Je passe pas mal de variables et je dois supporter les méthodes POST et GET. Pour la plupart des appels, toutes les variables ne sont pas présentes, donc je dois tester chaque variable de plusieurs façons, et le code devient long ...

C'est ce que j'essaie de faire, mais je n'arrive pas à identifier correctement la session et demande de paramaters (ce code ne compilera pas, car les tableaux sont indexés par numéro)

static string getParam(
    System.Web.SessionState.HttpSessionState[] Session, 
    System.Web.HttpRequest[] Request, 
    string id) 
{ 
    string rslt = ""; 

    try 
    { 
     rslt = Session[id].ToString(); 
    } 
    catch 
    { 
     try 
     { 
      rslt = Request[id].ToString(); 
     } 
     catch { } 
    } 

    return rslt; 
} 

de Page_Load, je veux appeler cette méthode comme suit pour récupérer le « mODE » paramater:

string rslt; 
rslt = getParam(Session, Request, "MODE"); 

Merci!

Répondre

3

Vous n'avez pas besoin de les déclarer en tant que paramètres de tableau; ils ne sont pas des tableaux, ils ne sont qu'un seul objet. Donc, votre signature de fonctions devrait ressembler à ceci:

static string getParam(
    System.Web.SessionState.HttpSessionState Session, 
    System.Web.HttpRequest Request, 
    string id) 

Avec juste que changer votre code devrait fonctionner, mais il pourrait être amélioré un peu, par exemple ce qui suit fait la même chose, mais sans risque de NullReferenceException:

private static string GetParameter(
    HttpSessionState session, 
    HttpRequest request, 
    string id) 
{ 
    var value = session[id] ?? request[id]; 
    return value == null ? string.Empty : value.ToString(); 
} 

Un couple de points à noter:

  1. Suivez les directives de style que vous voyez dans le cadre. Cela signifie que les noms de fonctions, les noms de paramètres, etc. sont identiques dans le même cas. De même, ne pas abréger les mots (c'est-à-dire utiliser 'parameter' au lieu de 'param'). C'est également une bonne idée de déclarer explicitement les modificateurs d'accès (c'est-à-dire si vous voulez dire qu'une méthode est privée, alors écrivez private).

  2. Jamais, jamais, utiliser try/catch pour attraper des exceptions non spécifiques. Vous pourriez finir par essayer d'avaler des exceptions asynchrones comme un manque de mémoire ou un abandon de thread qui est une recette pour un désastre. Si vous ne savez pas pourquoi vous ne devriez pas attraper des exceptions non spécifiques, alors c'est encore plus une raison pour ne pas le savoir. Jamais, jamais, attraper NullReferenceException (qui je suspecte est l'exception qui se produit souvent ici et pourquoi les blocs try/catch sont là). Chaque fois que cette exception est levée, c'est un bogue dans votre code que vous devez corriger. Contrairement à la plupart des règles de développement, il n'y a aucune exception à cette règle.

+0

Je n'aurais jamais pensé l'essayer avant d'avoir vu votre message. Mais c'est aussi une syntaxe valide. retour session [id] ?? demande [id] ?? string.Empty; –

+0

@gbogumil - Oui, c'est une syntaxe valide, mais elle ne fait pas exactement la même chose que le code ci-dessus. Notez que (selon la logique dans le post original) les valeurs non nulles doivent être converties en une chaîne. J'aurais pu faire '(session [id] ?? request [id] ?? chaîne.Empty) .ToString()' si ... –

+0

point pris.Si j'avais codé la totalité de la fonction, elle n'aurait pas été compilée car l'objet ne pourrait pas être renvoyé sous forme de chaîne. Le ToString() le fait. J'étais juste heureux d'apprendre une nouvelle syntaxe valide. –

0

Quel est le problème avec

rslt = Session["MODE"] != null ? Session["Mode"] : Request["Mode"]; 
rslt = rslt ?? "someDefaultValue"; 

?

Questions connexes