在服务器上,ViewContext.RouteData.Values["action"]为空...但在本地机器上正常运行。

5

我遇到了一个奇怪的问题,在我的测试服务器上,ViewContext.RouteData.Values["action"]为空,但在我的开发机(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: 对象引用未设置实例对象。

非常感谢您的帮助。提前致谢。


你找到解决方法了吗?我现在也遇到了类似的问题... - Ole Lynge
我没有这样做,最终我改变了逻辑和工作方式。 - rksprst
3个回答

2

您的开发和测试服务器上是否有不同版本的asp.net mvc?尝试在测试服务器上将System.Web.Mvc复制到本地,看看是否可以解决问题。(右键单击引用,选择属性,将Copy Local更改为true)

这可能有助于解决您的问题,但是这里有一个辅助扩展程序,我从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;
}

也许可以尝试在以下四个引用上进行:System.Web.Abstractions、System.Web.Extensions、System.Web.Mvc和System.Web.Routing?我认为这些是asp.net使用的四个引用。 - Joseph Yaduvanshi
当我重新发布时,我对所有与MVC相关的dll进行了“复制本地”操作...因此,除了一些其他常规的asp.net dll之外,还有这些。我只是不明白为什么它在开发环境中可以工作,但在暂存服务器上却不能工作。 - rksprst

0

尝试使用大写字母

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


0

我不知道为什么它在一个地方能够工作而在另一个地方不能,但是:

  1. 你应该将代码分成几行来确定到底是什么为空(var route = ViewContext.RouteData; var values = ...;)等等。

  2. 你从哪里调用CheckActiveClass?在什么时候?它在哪里?ViewContext并不总是随处可用的。但是在第一步之后,你会更清楚哪些内容不可用。

詹姆斯


我正在视图页面的代码后台使用它。同样也在母版页的代码后台使用。我会将其分解以查看错误发生在哪里。这很奇怪,因为它在开发机器上运行正常,但在暂存服务器上却不行。 - rksprst

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接