2009-08-09 2 views
5

Ho un problema strano in cui ViewContext.RouteData.Values ​​["action"] è nullo sul mio server di staging, ma funziona bene sulla mia macchina di sviluppo (server di sviluppo asp.net).ViewContext.RouteData.Values ​​["action"] è null sul server ... funziona correttamente sul computer locale

Il codice è semplice:

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

ottengo l'errore sulle ViewContext.RouteData.Values ​​[ "azione"] linea. L'errore è:

Dettagli eccezione: System.NullReferenceException: riferimento oggetto non impostato su un'istanza di un oggetto.

Qualsiasi aiuto è apprezzato. Grazie in anticipo.

+0

Hai trovato qualche soluzione a questo? Ho un problema simile ora ... –

+0

No, non l'ho fatto, ho finito per cambiare la logica e il modo in cui funziona. – rksprst

risposta

2

Sono disponibili versioni diverse di asp.net mvc sui server di sviluppo e di gestione temporanea? Provare a copiare System.Web.Mvc localmente sul server di staging e vedere se lo risolve. (Fare clic con il pulsante destro del mouse sul riferimento, scegliere Proprietà e modificare Copia locale su vero)

Questo potrebbe o non potrebbe aiutare la situazione, ma qui è un'estensione di supporto che ho rubato da un modello MVC su 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

Ho appena ripubblicato con copia locale e ottengo lo stesso errore ... – rksprst

+0

magari provate quanto sopra su: System.Web.Abstractions, System.Web.Extensions, System.Web.Mvc e System.Web.Routing? Penso che quelli siano i quattro riferimenti usati da asp.net. –

+0

Quando ho ripubblicato, ho fatto "copia locale" su tutte le dll relative MVC ... quindi quelle più alcune altre dll asp.net per ogni evenienza. Non vedo perché funzionerebbe su dev e non sul server di staging. – rksprst

0

non posso parlare per il motivo per cui funziona un luogo e non un altro, ma:

  1. si dovrebbe rompere il codice fino in diverse linee di capire esattamente che cosa è nullo (percorso var = ViewContext.RouteData; var values ​​= ...;), ecc.

  2. Da dove si chiama CheckActiveClass? A che ora? Dove si trova? ViewContext non è sempre disponibile ovunque. Ma avrai un'idea migliore di ciò che non è disponibile dopo # 1.

James

+0

Lo sto usando sul codebehind delle pagine view. Anche sul codebehind della pagina master. Lo romperò per vedere dove si sbaglia. È strano perché funziona su una macchina di sviluppo, ma non sul server di staging. – rksprst

0

Provare a usare capitali

String = CurrentController ViewContext.RouteData.Values ​​[ "controller"] ToString().; String currentAction = ViewContext.RouteData.Values ​​["Action"]. ToString(); String currentID = ViewContext.RouteData.Values ​​["ID"]. ToString();