Pourquoi est-EditorFor dans mon application ASP.NET MVC 2 lancer ArgumentNullException?
-
27-09-2019 - |
Question
J'ai un problème bizarre avec EditorFor dans un de mes vues. Le code suivant renvoie une ArgumentNullException.
<%: Html.EditorFor(x => x.Name) %>
Cependant, le code suivant est très bien.
<%: Html.TextBoxFor(x => x.Name) %>
Model.Name est une variable de chaîne -. Et son ensemble
EditorFor fonctionne dans une autre vue -. Jusqu'à cette vue se bloque, à quel point je dois redémarrer le serveur Web de développement (Cassini) ou tous les appels EditorFor accident avec le même message
J'ai couru un test avec la source MVC 2, en espérant que je pourrais obtenir un aperçu, mais cela marchait bien! On peut supposer que la source RTM MVC 2 sur il devrait être celui VS2010 (dates semblent concorder).
Je viens passe à TextBoxFor, comme c'est très bien - mais je voudrais savoir quel est le problème. Je suis en cours d'exécution sous .NET 4, VS2010 et Win7 x64.
[ Mise à jour :. Même problème se produit avec DisplayFor]
trace de la pile partielle est la suivante:
[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
La solution
Qu'est-ce que l'apparence du modèle comme éditeur pour la propriété que vous passe? (Je suppose que x.Name est une chaîne, vous devriez donc avoir un modèle appelé String.ascx dans les vues / Shared / EditorTemplates).
Il probable que le modèle de l'éditeur qui se charge de la chaîne ne fonctionne pas comme une chaîne nulle étant passée.
Si vous ne disposez pas d'un modèle éditeur personnalisé pour la chaîne (et tout ce que vous voulez est une zone de texte de base), alors il n'y a aucune raison d'utiliser EditorFor.