c# - Razor 助手中出现奇怪的 NullReferenceException

标签 c# razor webforms razor-2

我在 C# Web Forms 应用程序中使用 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放在 srcimg 的属性标签,我得到一个 NullReferenceExceptionfirstname .是的,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 调用前两个助手时,它们无一异常(exception)地显示输出(并且图像正常显示):

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

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

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

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

最佳答案

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

错误代码:

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

工作代码:

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

关于c# - Razor 助手中出现奇怪的 NullReferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19935861/

相关文章:

javascript - 在 ASP.NET(Web 表单)中单击按钮后显示 "Loading/Loader/Progress Bar"

c# - 在 WPF 数据网格中将 Null 或默认 DateTime 值显示为 "blank"或 NA

c# - 如何通过带有数据注释的 ModelState 验证 GET url 参数

c# - MethodBase.GetCurrentMethod().Name 与 [CallerMemberName]

asp.net-mvc-3 - 在 Razor/MVC3 中使用 @Html.ActionLink 获取原始文本?

javascript - 如何将文本框值传递给 Javascript 函数?

c# - 如何在没有用户交互的情况下在 ASP.NET 中启动任务

c# - 如何在任何事件触发后保持浏览器滚动位置

jQuery ajax - 只获取与用户相关的结果?

javascript - 无法与 asp.net 服务器通信