0

J'ai un problème étrange avec EditorFor dans une de mes vues. Le code suivant lève une ArgumentNullException.Pourquoi EditorFor dans mon application ASP.NET MVC 2 lançant ArgumentNullException?

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

Cependant, le code suivant est correct.

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

Model.Name est une variable de chaîne - et elle est définie. EditorFor fonctionne dans une autre vue - jusqu'à ce que cette vue se bloque, à quel point puis je dois redémarrer le serveur Web de développement (Cassini) ou tous les appels EditorFor plantent avec le même message.

J'ai effectué un test avec la source MVC 2, espérant que je pourrais avoir un aperçu, mais cela a fonctionné OK! On peut supposer que la source MVC 2 RTM là-bas devrait être celle de VS2010 (les dates semblent correspondre).

Je viens de passer à TextBoxFor, comme c'est bien - mais j'aimerais savoir quel est le problème. Je cours sous .NET 4, VS2010 et Win7 x64.

[Mise à jour . Même problème se produit avec DisplayFor]

trace de la pile partielle est:

[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 

Répondre

1

Qu'est-ce que le modèle de l'éditeur ressemble à la propriété que vous êtes de passage? (Je suppose que x.Name est une chaîne, vous devriez donc avoir un template appelé String.ascx dans Views/Shared/EditorTemplates).

Il est probable que le modèle d'éditeur chargé pour la chaîne n'aime pas qu'une chaîne nulle soit transmise.

Si vous ne disposez pas d'un modèle d'éditeur personnalisé pour la chaîne (et que vous souhaitez uniquement une zone de texte de base), il n'y a aucune raison d'utiliser EditorFor.

+0

Oui, "Nom" est une variable chaîne. Et non, je n'ai pas d'éditeur personnalisé. Je suppose que je vais juste sauter EditorFor, mais je me suis intéressé à la raison pour laquelle il casse dans certains scénarios (et DisplayFor semble aussi faire). Peut-être que ça ira bien avec MVC 3 ... – dommer

+0

Ouais, c'est probablement un bug dans hot il gère le modèle de chaîne par défaut EditorFor. Je parie qu'il appelle simplement Html.TextBox en interne lorsqu'il n'y a pas de modèle personnalisé. – automagic

Questions connexes