【问题标题】:Strange NullRefereneceException in Razor helperRazor 助手中奇怪的 NullReferenceException
【发布时间】:2013-11-24 23:54:59
【问题描述】:

我在 C# Web 表单 应用程序中使用 Razor Helpers。

以下代码在调用时编译并呈现 A-OK:

@helper MemberListItem(string firstname, string lastname, string avatarUrl)
{
    <li>
        @firstname @lastname
        @avatarUrl
    </li>
}

输出(对助手的两次调用):

<li>Bryan Arnold ../../Resources/Images/Placeholders/generic-user-image.jpg</li>
<li>Doug Bland ../../Resources/Images/Placeholders/generic-user-image.jpg</li>

但是当我更改帮助器以便将avatarUrl 放置在img 标记的src 属性中时,我在firstname 上得到一个NullReferenceException。是的,NullReferenceException 位于 firstname

以下代码编译但在调用时抛出 NRE:

@helper MemberListItem(string firstname, string lastname, string avatarUrl)
{
    <li>
        @firstname @lastname
        <img src="@avatarUrl"/>
    </li>
}

请记住,除了在帮助器中放置 @avatarUrl 之外,我没有更改任何内容。

如何让图像显示?

更新 1: 我还尝试将我的img 代码包装在&lt;text&gt;&lt;/text&gt; 中(无济于事):

<li>
    @firstname @lastname
    <text>
        <img src="@avatarUrl"/>
    </text>
</li>

更新 2: 这是错误:

Object reference not set to an instance of an object.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 

Line 11: {
Line 12:     <li>
Line 13:         @firstname @lastname
Line 14:         <img src="@avatarUrl"/>
Line 15:     </li>

Source File: RazorHelpers\Family.cshtml    Line: 13 

更新 3: 我忘了提到我在一个单独的文件中定义了@helper。然后,我从这样的 aspx 模板中调用该助手:

<%= @HelperFile.Helper(parameters).ToString() %>

另外,我认为@Luaan 可能会有所作为。我曾尝试摆弄~ 以获取我的图像文件的相对路径,认为 Razor 可能会抛出 NRE,因为它无法找到该文件。我的项目中似乎没有~ 的设置。

带有静态文件路径:

这行得通:

<img src="/Resources/Images/Placeholders/generic-user-image.jpg"/>

这没有(NullReferenceException):

<img src="~/Resources/Images/Placeholders/generic-user-image.jpg"/>

带有动态文件路径:

这不起作用(NullReferenceException):

<img src="@avatarUrl"/>

也不这样做(NullReferenceException):

<img src="~@avatarUrl"/>

注意:Resources 目录位于我网站的根目录中。

更新 4:

由于我的项目的时间限制,我已经抛弃了我原来的助手(这个问题开头提到的那个)并使用了纯 ASPX 模板。但是,我正在尝试在此应用程序中使用 Razor 助手来实现不同的功能,并且遇到了与之前描述的相同的问题。

这是一个类似的帮助程序(源代码和编译代码)。助手应该显示一个链接列表,允许用户使用各种身份提供者(google、facebook、twitter、yahoo)为我的应用程序注册/登录。这里的故事是一样的;当我只打印 img src 时,助手执行没有错误,但当我将 img src 放入实际的 &lt;img/&gt; 标记时,它会抛出 NullReferenceException。

来源:

@helper ListGroupGrid(IEnumerable<ExternalIdentityProvider> providers) {
    <div>
        @foreach(var provider in providers){
            @provider.Name
            <img src="@provider.IconUrl"/>
        }
    </div>
}

编译后的代码(来自 c:\Windows 中的 Temporary ASP.NET Files):

#pragma checksum "C:\Users\Public\Documents\VisualStudioProjects\OnlineStable\Aqha\App_Code\RazorHelpers\IdentityProvider.cshtml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "46B0FEE2042706017F4AE53D4EA612F3E73EDF8B"
//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.18052
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace ASP.RazorHelpers {
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Web;
    using System.Web.Helpers;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.WebPages;
    using System.Web.WebPages.Html;

    #line 1 "C:\Users\Public\Documents\VisualStudioProjects\OnlineStable\Aqha\App_Code\RazorHelpers\IdentityProvider.cshtml"
    using Aqha.DatabaseHelpers;

    #line default
    #line hidden

    #line 2 "C:\Users\Public\Documents\VisualStudioProjects\OnlineStable\Aqha\App_Code\RazorHelpers\IdentityProvider.cshtml"
    using Aqha.RazorExtensions;

    #line default
    #line hidden

    #line 3 "C:\Users\Public\Documents\VisualStudioProjects\OnlineStable\Aqha\App_Code\RazorHelpers\IdentityProvider.cshtml"
    using DevExpress.Utils.Drawing.Helpers;

    #line default
    #line hidden


    public class IdentityProvider : System.Web.WebPages.HelperPage {

#line hidden

#line 5 "C:\Users\Public\Documents\VisualStudioProjects\OnlineStable\Aqha\App_Code\RazorHelpers\IdentityProvider.cshtml"
public static System.Web.WebPages.HelperResult ListGroupGrid(IEnumerable<IdentityProviderData.ExternalIdentityProvider> providers) {
#line default
#line hidden
return new System.Web.WebPages.HelperResult(__razor_helper_writer => {

#line 5 "C:\Users\Public\Documents\VisualStudioProjects\OnlineStable\Aqha\App_Code\RazorHelpers\IdentityProvider.cshtml"



#line default
#line hidden
BeginContext(__razor_helper_writer, "~/App_Code/RazorHelpers/IdentityProvider.cshtml", 202, 11, true);

WriteLiteralTo(__razor_helper_writer, "    <div>\r\n");

EndContext(__razor_helper_writer, "~/App_Code/RazorHelpers/IdentityProvider.cshtml", 202, 11, true);


#line 7 "C:\Users\Public\Documents\VisualStudioProjects\OnlineStable\Aqha\App_Code\RazorHelpers\IdentityProvider.cshtml"


#line default
#line hidden

#line 7 "C:\Users\Public\Documents\VisualStudioProjects\OnlineStable\Aqha\App_Code\RazorHelpers\IdentityProvider.cshtml"
         foreach(var provider in providers){


#line default
#line hidden
BeginContext(__razor_helper_writer, "~/App_Code/RazorHelpers/IdentityProvider.cshtml", 272, 13, false);


#line 8 "C:\Users\Public\Documents\VisualStudioProjects\OnlineStable\Aqha\App_Code\RazorHelpers\IdentityProvider.cshtml"
WriteTo(__razor_helper_writer, provider.Name);


#line default
#line hidden
EndContext(__razor_helper_writer, "~/App_Code/RazorHelpers/IdentityProvider.cshtml", 272, 13, false);


#line 8 "C:\Users\Public\Documents\VisualStudioProjects\OnlineStable\Aqha\App_Code\RazorHelpers\IdentityProvider.cshtml"



#line default
#line hidden
BeginContext(__razor_helper_writer, "~/App_Code/RazorHelpers/IdentityProvider.cshtml", 287, 16, true);

WriteLiteralTo(__razor_helper_writer, "            <img");

EndContext(__razor_helper_writer, "~/App_Code/RazorHelpers/IdentityProvider.cshtml", 287, 16, true);

WriteAttributeTo(__razor_helper_writer, "src", Tuple.Create(" src=\"", 303), Tuple.Create("\"", 326)

#line 9 "C:\Users\Public\Documents\VisualStudioProjects\OnlineStable\Aqha\App_Code\RazorHelpers\IdentityProvider.cshtml"
, Tuple.Create(Tuple.Create("", 309), Tuple.Create<System.Object, System.Int32>(provider.IconUrl

#line default
#line hidden
, 309), false)
);

BeginContext(__razor_helper_writer, "~/App_Code/RazorHelpers/IdentityProvider.cshtml", 327, 4, true);

WriteLiteralTo(__razor_helper_writer, "/>\r\n");

EndContext(__razor_helper_writer, "~/App_Code/RazorHelpers/IdentityProvider.cshtml", 327, 4, true);


#line 10 "C:\Users\Public\Documents\VisualStudioProjects\OnlineStable\Aqha\App_Code\RazorHelpers\IdentityProvider.cshtml"
        }


#line default
#line hidden
BeginContext(__razor_helper_writer, "~/App_Code/RazorHelpers/IdentityProvider.cshtml", 342, 12, true);

WriteLiteralTo(__razor_helper_writer, "    </div>\r\n");

EndContext(__razor_helper_writer, "~/App_Code/RazorHelpers/IdentityProvider.cshtml", 342, 12, true);


#line 12 "C:\Users\Public\Documents\VisualStudioProjects\OnlineStable\Aqha\App_Code\RazorHelpers\IdentityProvider.cshtml"


#line default
#line hidden
});

#line 12 "C:\Users\Public\Documents\VisualStudioProjects\OnlineStable\Aqha\App_Code\RazorHelpers\IdentityProvider.cshtml"
}
#line default
#line hidden


        public IdentityProvider() {
        }

        protected static ASP.global_asax ApplicationInstance {
            get {
                return ((ASP.global_asax)(Context.ApplicationInstance));
            }
        }
    }
}

更新 5: 我又做了一些测试。为了尽可能清楚地说明问题,我删除了所有输入参数和额外的标记。

考虑以下三个助手:

@helper BaseCase() {
    <img src="/Resources/Images/Placeholders/generic-user-image.jpg"/>
}

@helper VariableBaseCase() {
    var src = "/Resources/Images/Placeholders/generic-user-image.jpg";
    <img src="/Resources/Images/Placeholders/generic-user-image.jpg"/>
    <text>the source is @src</text>
}

@helper Variable() {
    var src = "/Resources/Images/Placeholders/generic-user-image.jpg";
    <img src="@src"/>
    <text>the source is @src</text>
}

当我从 ASPX 调用前两个助手时,它们毫无例外地显示输出(并且图像正常显示):

<%= RazorHelpers.ImageTest.BaseCase().ToString() %>
<%= RazorHelpers.ImageTest.VariableBaseCase().ToString() %>

当我调用最后一个助手时,我得到了同样的错误。

<%= RazorHelpers.ImageTest.Variable().ToString() %>

我希望现在我认为这是一个相对路径问题是正确的。如何让 Razor 在我的 Web 窗体应用程序中显示具有动态 src 属性的图像?

【问题讨论】:

  • 您确定不是null 还是没有其他事情发生?使用您的确切方法,并将两组数据传递给它,我得到了正确的输出。我应该提到的是在 MVC 应用程序中。
  • 我很肯定这不是null。我的基本情况表明了这一点。
  • 嗯,在某处肯定有一个null。我只知道这不是我的数据。另外,我正在使用 Web 表单。
  • 有没有办法查看生成的 C# 文件?您可能会在 ASP.NET 临时文件中找到它。或者您可以下载并查看 RazorGenerator 的输出。
  • 我很困惑。我正在使用 VS 2012 + update 3。我创建了一个新的空 Web 表单应用程序。我将 Razor 3 和 WebPages 3 nuget 包添加到我的项目中。我在我的项目中添加了一个 CSHTML 文件。我在那里输入了你的代码。我运行应用程序没有任何错误,结果是正确且格式正确的 HTML。我做了什么不同的事情吗?

标签: c# razor webforms razor-2


【解决方案1】:

我刚刚遇到了一个类似的问题(mvc.net 4)。 我是这样绕过的:

错误代码:

<input name="ItemUID" type="hidden" value="@ItemUID" />

工作代码:

<input name="ItemUID" type="hidden" @("value=")"@ItemUID" />

【讨论】:

  • 非常有趣.. 我得进一步检查一下
【解决方案2】:

Razor 解析器将无法正确解析您的 HTML,因为它一次查找部分。 在这种情况下,它假定整个块 () 是 HTML

尝试用 此处的HTML text>包围您的HTML 让解析器更容易阅读和解释

【讨论】:

  • 谢谢,我刚试过,但没有帮助。 NRE 仍在发生。
  • 尝试单独包装 。我认为您的 @avatarUrl 没有正确呈现
  • 这也无济于事。 :(
  • 你能告诉我你得到的错误吗?因为我刚刚在我的 MVC 4 razor 项目上尝试了你的原始代码,它运行良好
【解决方案3】:

我相信 Razor 会尝试确保您传递给 img src 的 URL 是有效的。您确定文件确实存在于正确的相对目录中吗? 也许您可以尝试以根相对格式(即"~/Resources/Images/Placeholders/generic-user-image.jpg")传递 URL。 如果这没有帮助,您可以尝试使用@Html.Image 或@Html.Raw 渲染图像。 如果这没有帮助,请尝试@Url.Content(avatarUrl),但这真的很努力:)

【讨论】:

  • 与此相关,您是在实际页面中定义@helper,还是某种帮助“库”?尝试解析 URL 时,它可能会在某种页面引用上抛出 null。作为测试,尝试将@helper 移动到您实际使用它的页面。
  • 用硬编码值做了一些测试。这有效:&lt;img src="/Resources/Images/Placeholders/generic-user-image.jpg"/&gt;。这会引发 NRE:&lt;img src="~/Resources/Images/Placeholders/generic-user-image.jpg"/&gt;
  • 另外,这不起作用(来自我的问题)&lt;img src="@avatarUrl"/&gt;。这也不起作用(添加~):&lt;img src="~@avatarUrl"/&gt;。对于后者,src 的值将是 ~/Resources/Images/Placeholders/generic-user-image.jpg
  • 看来 ~ 对我来说根本不起作用。那是 Razor 还是 MVC 的构造? (我正在使用 Web 表单)
  • 另外,我在一个单独的文件中定义了@helper。然后,我从这样的 aspx 模板调用该助手:&lt;%= @HelperFile.Helper(parameters).ToString() %&gt;
【解决方案4】:

看来你不是唯一一个有问题的人。您的 MVC 版本(我假设为 MVC2)有一个错误,当它调用 WriteAttributeTo 时会引发异常。此问题在以下 stackoverflow 问题“Null reference exception in WriteAttributeTo method”中有所提及。

唯一合理的解决方案是使用更新的版本。可能是 MVC3(带有 update1)。您的 .NET 版本是 4.0+,所以不会有问题。

【讨论】:

  • 对不起,我的错。我的意思是剃须刀运行时。更新您的剃须刀运行时。
【解决方案5】:

这在某处敲响了警钟。尝试以下在变量周围加上括号的方法,它似乎对 Razor 引擎有所帮助:

@helper MemberListItem(string firstname, string lastname, string avatarUrl)
{
    <li>
        @(firstname) @(lastname)
        <img src="@(avatarUrl)" />
    </li>
}

【讨论】:

  • 这解决了我遇到的一个问题。我没有在我的助手中使用 img 标签,而是使用 @ 编写属性。谢谢!
【解决方案6】:

有点晚了,但我遇到了同样的问题,花了我几个小时才解决。 为我解决了这个问题的原因如下:

string attributeValue= "some value";

string attributeExpression= "attributeName=" + attributeValue;

<div class="" id="" @attributeExpression></div>

【讨论】:

    猜你喜欢
    • 2017-02-10
    • 1970-01-01
    • 2014-08-12
    • 2013-07-12
    • 1970-01-01
    • 2014-03-14
    • 2016-02-11
    • 1970-01-01
    • 2017-02-27
    相关资源
    最近更新 更多