Razor帮助器中的Strange NullRefereneceException

问题描述 投票:16回答:6

我在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放在src标记的img属性中时,我在NullReferenceException上得到了firstname。是的,NullReferenceExceptionfirstname上。

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

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

请记住,除了在助手中放置@avatarUrl之外,我没有做任何其他更改。

如何显示图像?

更新1:我也尝试过将img代码包装在<text></text>中(无济于事):

<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放入实际的<img/>标记时,它会引发NullReferenceException。

来源:

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

已编译的代码(来自c:\ Windows中的临时ASP.NET文件):

#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属性的图像?

我正在C#Web窗体应用程序中使用Razor Helpers。以下代码在被调用时编译并呈现A-OK:@helper MemberListItem(字符串名,字符串姓氏,字符串avatarUrl){&...

c# razor webforms razor-2
6个回答
2
投票

我只是有一个类似的问题(mvc.net 4)。我以这种方式绕过它:

错误代码:


1
投票

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


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

1
投票
似乎您不是唯一遇到问题的人。您的MVC版本(我假设为MVC2)具有一个调用WriteAttributeTo时引发和异常的错误。下面的stackoverflow问题“ Null reference exception in WriteAttributeTo method”中提到了此问题。

1
投票
这会在某处敲响钟声。尝试在变量周围加上以下括号,这似乎可以帮助Razor引擎:

0
投票
有点晚,但是我遇到了同样的问题,花了我几个小时才能解决。对我来说解决此问题的原因如下:
© www.soinside.com 2019 - 2024. All rights reserved.