2009-08-09 9 views
5

J'ai un problème étrange où ViewContext.RouteData.Values ​​["action"] est null sur mon serveur de transfert, mais fonctionne bien sur ma machine dev (serveur de développement asp.net).ViewContext.RouteData.Values ​​["action"] est null sur le serveur ... fonctionne bien sur la machine locale

Le code est simple:

public string CheckActiveClass(string actionName) 
    { 
     string text = ""; 
     if (ViewContext.RouteData.Values["action"].ToString() == actionName) 
     { 
      text = "selected"; 
     } 
     return text; 
    } 

Je reçois l'erreur sur les ViewContext.RouteData.Values ​​[ "action"] ligne. L'erreur est:

Détails d'exception: System.NullReferenceException: Référence d'objet non définie sur une instance d'un objet.

Toute aide est appréciée. Merci d'avance.

+0

Avez-vous trouvé une solution à ce problème? J'ai un problème similaire maintenant ... –

+0

Non, je n'ai pas, j'ai fini par changer la logique et la façon dont ça fonctionne. – rksprst

Répondre

2

Avez-vous différentes versions de asp.net mvc sur vos serveurs de développement et de mise en scène? Essayez de copier System.Web.Mvc localement sur le serveur de transfert et voyez si cela le corrige. (Cliquez avec le bouton droit de la souris sur la référence, choisissez les propriétés et remplacez Copier local par true)

Ceci peut ne pas aider votre situation, mais voici une extension d'aide que j'ai volée depuis un template MVC sur asp.net/mvc:

/// <summary> 
/// Checks the current action via RouteData 
/// </summary> 
/// <param name="helper">The HtmlHelper object to extend</param> 
/// <param name="actionName">The Action</param> 
/// <param name="controllerName">The Controller</param> 
/// <returns>Boolean</returns> 
public static bool IsCurrentAction(this HtmlHelper helper, string actionName, string controllerName) 
{ 
    string currentControllerName = (string)helper.ViewContext.RouteData.Values["controller"]; 
    string currentActionName = (string)helper.ViewContext.RouteData.Values["action"]; 

    if (currentControllerName.Equals(controllerName, StringComparison.CurrentCultureIgnoreCase) && currentActionName.Equals(actionName, StringComparison.CurrentCultureIgnoreCase)) 
     return true; 

    return false; 
} 
+0

Je viens de republier avec copie locale et je reçois la même erreur ... – rksprst

+0

peut-être essayer ci-dessus sur: System.Web.Abstractions, System.Web.Extensions, System.Web.Mvc, et System.Web.Routing? Je pense que ce sont les quatre références utilisées par asp.net. –

+0

Quand j'ai republié, j'ai fait "copier local" sur tous les dlls liés à MVC ... donc ceux-ci ainsi que d'autres DLL asp.net régulières juste au cas où. Je ne vois tout simplement pas pourquoi cela fonctionnerait sur le développement et pas sur le serveur de mise en scène. – rksprst

0

Je ne peux pas dire pourquoi cela fonctionne un endroit et pas un autre, mais:

  1. Vous devriez briser le code en plusieurs lignes pour comprendre exactement ce qui est nulle (route var = ViewContext.RouteData; var values ​​= ...;), etc.

  2. De où appelez-vous CheckActiveClass? À quelle heure? Où est-il situé? ViewContext n'est pas toujours disponible partout. Mais vous aurez une meilleure idée de ce qui n'est pas disponible après # 1.

James

+0

Je l'utilise sur le codebehind des pages d'affichage. Aussi bien sur le codebehind de la masterpage. Je vais le décomposer pour voir où il y a des erreurs. C'est juste bizarre car cela fonctionne sur la machine de développement, mais pas sur le serveur de mise en scène. – rksprst

0

Essayez d'utiliser les capitales

Chaîne currentController = ViewContext.RouteData.Values ​​[ "contrôleur"] toString(). String currentAction = ViewContext.RouteData.Values ​​["Action"]. ToString(); Chaîne currentID = ViewContext.RouteData.Values ​​["ID"]. ToString();

Questions connexes