Я использую Razor Helpers в приложении C# Web Forms.
Следующий код компилируется и отображается 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
. Да, NullReferenceException
на firstname
.
Следующий код компилируется, но при вызове выдает 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, но выдает исключение NullReferenceException, когда я помещаю img src в фактический тег <img/>
.
Источник:
@helper ListGroupGrid(IEnumerable<ExternalIdentityProvider> providers) {
<div>
@foreach(var provider in providers){
@provider.Name
<img src="@provider.IconUrl"/>
}
</div>
}
Скомпилированный код (из временных файлов ASP.NET в c:\Windows):
#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 отображать изображения с динамическими свойствами src
в моем приложении Web Forms?
null
или что больше ничего не происходит? Используя ваш точный метод и передав ему два набора данных, я получаю правильный результат. Я должен упомянуть, что это в приложении MVC. - person John H   schedule 12.11.2013null
. Мой базовый случай показывает это. - person Jonathan Wilson   schedule 12.11.2013null
. Я просто знаю, что это не мои данные. Кроме того, я использую веб-формы. - person Jonathan Wilson   schedule 12.11.2013#error
где-нибудь рядом с вашей функцией и попытаться скомпилировать. Он выдаст ошибку и покажет вам сгенерированный код для вашей страницы. Мне нужно увидеть это, чтобы понять эту ситуацию - person Erdogan Kurtur   schedule 25.11.2013#error
, но я не увидел особого результата. Я обновил свой вопрос скомпилированным кодом для примера помощника. - person Jonathan Wilson   schedule 26.11.2013