Почему EditorFor в моем приложении ASP.NET MVC 2 выбрасывает ArgumentNullException? - PullRequest
0 голосов
/ 30 октября 2010

У меня странная проблема с EditorFor в одном из моих представлений. Следующий код выдает исключение ArgumentNullException.

<%: Html.EditorFor(x => x.Name) %>

Тем не менее, следующий код подходит.

<%: Html.TextBoxFor(x => x.Name) %>

Model.Name является строковой переменной - и она установлена.

EditorFor работает в другом представлении - до тех пор, пока не произойдет сбой этого представления, после чего мне придется перезапустить веб-сервер разработки (Cassini) или все вызовы EditorFor завершатся с тем же сообщением.

Я провел тест с источником MVC 2, надеясь, что смогу понять, но это сработало! Предположительно источник MVC 2 RTM должен быть тем, что есть в VS2010 (даты, кажется, связаны).

Я только что переключился на TextBoxFor, это нормально, но я хотел бы знать, в чем проблема. Я работаю под .NET 4, VS2010 и Win7 x64.

[ Обновление : та же проблема возникает с DisplayFor.]

Частичная трассировка стека:

[ArgumentNullException: Value cannot be null.
Parameter name: stream]
   System.IO.StreamReader..ctor(Stream stream, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize) +9496369
   System.Web.UI.TemplateParser.ParseFile(String physicalPath, VirtualPath virtualPath) +232
   System.Web.UI.TemplateParser.ParseInternal() +86
   System.Web.UI.TemplateParser.Parse() +160
   System.Web.Compilation.BaseTemplateBuildProvider.get_CodeCompilerType() +110
   System.Web.Compilation.BuildProvider.GetCompilerTypeFromBuildProvider(BuildProvider buildProvider) +65
   System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders() +218
   System.Web.Compilation.BuildProvidersCompiler.PerformBuild() +40
   System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath) +8945798
   System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) +320
   System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) +111
   System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean throwIfNotFound) +125
   System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath, Type requiredBaseType, HttpContext context, Boolean allowCrossApp) +52
   System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(String virtualPath, Type requiredBaseType) +28
   System.Web.Mvc.BuildManagerWrapper.System.Web.Mvc.IBuildManager.CreateInstanceFromVirtualPath(String virtualPath, Type requiredBaseType) +36
   System.Web.Mvc.WebFormView.Render(ViewContext viewContext, TextWriter writer) +172
   System.Web.Mvc.Html.TemplateHelpers.ExecuteTemplate(HtmlHelper html, ViewDataDictionary viewData, String templateName, DataBoundControlMode mode, GetViewNamesDelegate getViewNames) +1154
   System.Web.Mvc.Html.TemplateHelpers.TemplateHelper(HtmlHelper html, ModelMetadata metadata, String htmlFieldName, String templateName, DataBoundControlMode mode, Object additionalViewData, ExecuteTemplateDelegate executeTemplate) +1626
   System.Web.Mvc.Html.TemplateHelpers.TemplateHelper(HtmlHelper html, ModelMetadata metadata, String htmlFieldName, String templateName, DataBoundControlMode mode, Object additionalViewData) +86
   System.Web.Mvc.Html.TemplateHelpers.TemplateFor(HtmlHelper`1 html, Expression`1 expression, String templateName, String htmlFieldName, DataBoundControlMode mode, Object additionalViewData, TemplateHelperDelegate templateHelper) +210
   System.Web.Mvc.Html.TemplateHelpers.TemplateFor(HtmlHelper`1 html, Expression`1 expression, String templateName, String htmlFieldName, DataBoundControlMode mode, Object additionalViewData) +129
   System.Web.Mvc.Html.EditorExtensions.EditorFor(HtmlHelper`1 html, Expression`1 expression) +87

1 Ответ

1 голос
/ 31 октября 2010

Как выглядит шаблон редактора для передаваемого вами свойства? (Я предполагаю, что x.Name является строкой, поэтому у вас должен быть шаблон с именем String.ascx в Views / Shared / EditorTemplates).

Вероятно, шаблон редактора, который загружается для строки, не похож на передаваемую пустую строку.

Если у вас нет пользовательского шаблона редактора для строки (и все, что вам нужно, это простое текстовое поле), то нет смысла использовать EditorFor.

...