ViewContext.RouteData.Values ​​["action"] имеет значение null на сервере ... отлично работает на локальной машине - PullRequest
5 голосов
/ 10 августа 2009

У меня странная проблема, когда ViewContext.RouteData.Values ​​["action"] имеет значение null на моем промежуточном сервере, но отлично работает на моем компьютере разработчика (сервере разработки asp.net).

Код прост:

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

Я получаю сообщение об ошибке в строке ViewContext.RouteData.Values ​​["action"]. Ошибка:

Сведения об исключении: System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.

Любая помощь приветствуется. Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 10 августа 2009

У вас есть разные версии asp.net mvc на ваших dev и промежуточных серверах? Попробуйте скопировать System.Web.Mvc локально на промежуточный сервер и посмотрите, исправит ли это. (Щелкните правой кнопкой мыши ссылку, выберите свойства и измените параметр Копировать локальный на true)

Это может или не может помочь вашей ситуации, но вот вспомогательное расширение, которое я украл из шаблона MVC на 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 голосов
/ 11 января 2010

Попробуйте использовать заглавные буквы

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

0 голосов
/ 10 августа 2009

Я не могу сказать, почему это работает в одном месте, а не в другом, но:

  1. Вы должны разбить код на несколько строк, чтобы точно определить, что является нулем (var route = ViewContext.RouteData; var values ​​= ...;) и т. Д.

  2. Откуда вы звоните в CheckActiveClass? Во сколько? Где это находится? ViewContext не всегда доступен везде. Но у вас будет лучшее представление о том, что недоступно после # 1.

Джеймс

...