【问题标题】:Asp.net MVC3 UrlHelper.Action() throws NullReferenceExceptionAsp.net MVC3 UrlHelper.Action() 抛出 NullReferenceException
【发布时间】:2011-08-24 07:57:38
【问题描述】:

问题

我目前正在为 ASP.net MVC 3 构建一个助手,但考虑到 UrlHelper.Action() 方法时遇到了问题。除了第一个请求(应用程序启动后)之外的每个请求,以下代码都会引发 NullReferenceException。

var src = htmlHelper.Url().Action("Css", "Asset", options);

相关堆栈

System.Web.HttpServerVarsCollection.Get(String name) +8740566
   System.Web.Mvc.UrlRewriterHelper.WasThisRequestRewritten(HttpContextBase httpContext) +42
   System.Web.Mvc.UrlRewriterHelper.WasRequestRewritten(HttpContextBase httpContext) +23
   System.Web.Mvc.PathHelpers.GenerateClientUrlInternal(HttpContextBase httpContext, String contentPath) +163
   System.Web.Mvc.PathHelpers.GenerateClientUrl(HttpContextBase httpContext, String contentPath) +63
   System.Web.Mvc.UrlHelper.GenerateUrl(String routeName, String actionName, String controllerName, RouteValueDictionary routeValues, RouteCollection routeCollection, RequestContext requestContext, Boolean includeImplicitMvcValues) +150
   System.Web.Mvc.UrlHelper.Action(String actionName, String controllerName, Object routeValues) +55

可能的原因

我使用了一个名为 AttributeRouting 的库,它是通过 nuget 安装的,我认为这可能会导致问题,但删除引用没有效果。

因为它确实在第一个请求中工作,但之后的每个请求都失败了,我觉得它与在应用程序启动时运行但应该在请求启动时运行的代码有关,或者某些变量/对象没有持久化超过请求。

额外信息

htmlHelper.Url() 是下面的扩展方法。

public static UrlHelper Url(this HtmlHelper helper)
{
    return new UrlHelper(helper.ViewContext.RequestContext);
}

【问题讨论】:

  • 升级到 MVC3 后我遇到了同样的问题 - 当所有单元测试一起运行时,所有调用 UrlHelper 的测试都会失败。如果我单独运行它们,甚至通过控制器运行它们,它们就会通过。你找到解决办法了吗?

标签: asp.net-mvc-3 c#-4.0 razor asp.net-routing


【解决方案1】:

var src = htmlHelper.Url().Action("Css", "Asset", options);您是在视图中还是在您的某个控制器中使用它?

无论哪种方式,都应该定义自己的 Url 对象(我在这里假设您使用的 htmlHelper 对象是您自己创建的)。

public class MyController : Controller
{
    ....
    public ActionResult Index()
    {
        var src = Url.Action("Css", "Asset", options);
        ....
    }
}

或者在你看来:

<head>
    <meta charset="UTF-8">
    <title>@ViewBag.Title</title>
    @{
        var src = Url.Action("Css", "Asset", options);
    }
    <link rel="Stylesheet" href="@src" />

或者更好,只是&lt;link rel="Stylesheet" href="@Url.Action("Css","Asset",options)" /&gt;

【讨论】:

  • 我创建的助手是从视图中调用的。帮助器中的 htmlHelper 在通过扩展方法创建时传递给它。
  • 嗯,也许我不完全理解你的问题。是否需要滚动您自己的 Url Helper 而不是 View 中已经可用的 Url Helper?我的意思是,您是否在提供的静态内容中做得更多,然后只是创建一个新的 UrlHelper 对象?您在哪里/何时创建 htmlHelper 对象?
【解决方案2】:

你解决过这个问题吗?我最近在安装 IIS 7 Url Rewrite Module v.2.0 时看到了这个错误。卸载后问题就消失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 2020-11-17
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多