MVC, HTML.RenderAction – Erreur: la Durée doit être un nombre positif
Sur mon site, je veux que l'utilisateur ait la possibilité de se connecter/déconnecter à partir de n'importe quelle page. Lorsque l'utilisateur de sélectionner la connexion bouton, une boîte de dialogue modale sera présente à l'utilisateur pour lui d'entrer dans ses lettres de créance.
Depuis de connexion sera sur chaque page, j'ai pensé que je voudrais créer une vue partielle de la connexion et l'ajouter à la page de mise en page. Mais quand j'ai fait ce que j'ai obtenu l'erreur suivante: Détails de l'Exception: System.InvalidOperationException: la Durée doit être un nombre positif.
Il y a d'autres façons de contourner ce qui ne serait pas à l'aide de vues partielles, mais je crois que cela devrait fonctionner.
Donc pour le tester, j'ai décidé de faire tout simple avec le code suivant:
Créé une page de mise en page avec le code suivant
@{Html.RenderAction("_Login", "Account");}
Dans le AccountController:
public ActionResult _Login()
{
return PartialView("_Login");
}
Vue Partielle _Login
<a id="signin">Login</a>
Mais quand je lance cette version simple de ce que j'obtiens toujours cette erreur:
Détails De L'Exception: System.InvalidOperationException: la Durée doit être un nombre positif.
Source d'erreur points à "@{Html.RenderAction("_Login", "Compte");}"
Il y a quelques conversations sur le web qui sont similaires à mon problème, qui l'identifie comme un bug avec MVC (voir les liens ci-dessous). Mais les liens se rapportent à la mise en Cache, et je ne vais pas faire toute la mise en cache.
OuputCache Profil de Cache ne fonctionne pas pour les enfant d'actions
http://aspnet.codeplex.com/workitem/7923
Asp.Net MVC 3 Partielle de la Page mise en Cache de Sortie de ne Pas Honorer les Paramètres de configuration
Asp.Net MVC 3 Partielle de la Page mise en Cache de Sortie de ne Pas Honorer les Paramètres de configuration
La mise en cache ChildActions à l'aide de profils de cache ne fonctionne pas?
La mise en cache ChildActions à l'aide de profils de cache ne fonctionne pas?
Je ne sais pas si cela fait une différence, mais je vais aller de l'avant et de l'ajouter ici. Je suis en utilisant MVC 3 avec un Rasoir.
Mise à jour
La Trace De Pile D'
[InvalidOperationException: Duration must be a positive number.]
System.Web.Mvc.OutputCacheAttribute.ValidateChildActionConfiguration() +624394
System.Web.Mvc.OutputCacheAttribute.OnActionExecuting(ActionExecutingContext filterContext) +127
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +72
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +784922
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +314
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +784976
System.Web.Mvc.Controller.ExecuteCore() +159
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +335
System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +62
System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +20
System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +54
System.Web.Mvc.<>c__DisplayClass4.<Wrap>b__3() +15
System.Web.Mvc.ServerExecuteHttpHandlerWrapper.Wrap(Func`1 func) +41
System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage, VirtualPath path, VirtualPath filePath, String physPath, Exception error, String queryStringOverride) +1363
[HttpException (0x80004005): Error executing child request for handler 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'.]
System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage, VirtualPath path, VirtualPath filePath, String physPath, Exception error, String queryStringOverride) +2419
System.Web.HttpServerUtility.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage) +275
System.Web.HttpServerUtilityWrapper.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm) +94
System.Web.Mvc.Html.ChildActionExtensions.ActionHelper(HtmlHelper htmlHelper, String actionName, String controllerName, RouteValueDictionary routeValues, TextWriter textWriter) +838
System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper htmlHelper, String actionName, String controllerName, RouteValueDictionary routeValues) +56
ASP._Page_Views_Shared_SiteLayout_cshtml.Execute() in c:\Projects\prj Projects\prj\Source\Presentation\prj.PublicWebSite\Views\Shared\SiteLayout.cshtml:80
System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +280
System.Web.Mvc.WebViewPage.ExecutePageHierarchy() +104
System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +173
System.Web.WebPages.WebPageBase.Write(HelperResult result) +89
System.Web.WebPages.WebPageBase.RenderSurrounding(String partialViewName, Action`1 body) +234
System.Web.WebPages.WebPageBase.PopContext() +234
System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +384
System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +33
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +784900
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +784900
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +265
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +784976
System.Web.Mvc.Controller.ExecuteCore() +159
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +335
System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +62
System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +20
System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +54
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +453
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +371
Mise à jour
Quand je Pause dans le Code, les erreurs à @{Html.RenderAction("_Login", "Compte");}, avec l'exception suivante. L'exception interne
Error executing child request for handler 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'.
at System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage, VirtualPath path, VirtualPath filePath, String physPath, Exception error, String queryStringOverride)
at System.Web.HttpServerUtility.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage)
at System.Web.HttpServerUtilityWrapper.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm)
at System.Web.Mvc.Html.ChildActionExtensions.ActionHelper(HtmlHelper htmlHelper, String actionName, String controllerName, RouteValueDictionary routeValues, TextWriter textWriter)
at System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper htmlHelper, String actionName, String controllerName, RouteValueDictionary routeValues)
at ASP._Page_Views_Shared_SiteLayout_cshtml.Execute() in c:\Projects\prj Projects\prj\Source\Presentation\prj.PublicWebSite\Views\Shared\SiteLayout.cshtml:line 80
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
at System.Web.WebPages.WebPageBase.Write(HelperResult result)
at System.Web.WebPages.WebPageBase.RenderSurrounding(String partialViewName, Action`1 body)
at System.Web.WebPages.WebPageBase.PopContext()
at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
Répondre
Grâce Darin Dimitrov
Venir pour le savoir, mon AccountController avait l'attribut suivant
[Système.Web.Mvc.OutputCache(NoStore =true, Durée = 0, VaryByParam = "*")].
Je ne crois pas que cela devrait l'origine d'un problème, mais quand je l'ai supprimé l'attribut tout a fonctionné.
BarDev
[OutputCache]
attribut. Essayez de faire cela dans un nouveau projet que vous commencez à partir de zéro. Je suis sûr que vous serez en mesure de le réduire.Quelle est la trace de la pile?
dans votre exception stacktrace, nous pouvons voir
OutputCacheAttribute
. Si vous possédez m'5 dollars 🙂Je vais créer un nouveau projet et de voir si je peux reproduire le problème.
Darin Dimitrov, vous êtes commpletely correcte. Merci pour l'aide. Comment au sujet de la prochaine fois que vous êtes à denver, je vais vous acheter une boisson. Permettez-moi de poser une autre question. Dans mon AccountController j'ai le texte suivant pour la classe [Système.Web.Mvc.OutputCache(NoStore = true, Durée = 0, VaryByParam = "*")]. Je ne sais pas pourquoi je l'ai ajouté. Même si je n'ai pas de mise en cache enbaled, n'ai-je besoin? Merci encore.
OriginalL'auteur Mike Barlow - BarDev | 2011-02-14
Vous devez vous connecter pour publier un commentaire.
Ajouter mon commentaire comme réponse:
Hum, c'est bizarre. En lisant votre question, je suis prêt à parier 5 dollars que vous avez activé la mise en cache en quelque sorte. Essayez de renommer l'action, contrôleur. Assurez-vous que l'action que vous appelez n'est pas décoré de la
[OutputCache]
attribut. Essayez de faire cela dans un nouveau projet que vous commencez à partir de zéro. Je suis sûr que vous serez en mesure de le réduire.[OutputCache(Duration=0, NoStore=true, VaryByParam="*")]
est appliquée à la fois sur la base de contrôleur et de l'action, j'ai même redémarré mon pc mais toujours cette erreur, la moindre idée?Obtenu fixe, tout attribut autre que
Durantion
etVaryByParam
ne sont pas autorisés +Duration
devrait être > 0 etVaryByParam
ne doit pas être vide. Reportez-vous à ici. Est allé à cet article les commentaires de @frennky sur la mise en Cache ChildActions à l'aide de profils de cache ne fonctionne pas?Également vérifier votre filtre global de la classe,
FilterConfig.cs
, pour laOutputCacheAttribute
objet. Exemple:filters.Add(new OutputCacheAttribute { VaryByParam = "*", Duration = 1});
OriginalL'auteur Darin Dimitrov
Voici les correctifs pour ce problème.
http://thenullreference.com/blog/fixing-the-asp-net-mvc-3-outputcacheattribute-for-partial-views-to-honor-some-web-config-settings/
OriginalL'auteur Wayne Brantley
J'ai eu de contourner le problème en créant une coutume
OutputCache
attribut, qui charge manuellement leDuration
,VarByCustom
etVarByParam
à partir du profil:L'avantage de cette approche est que vous obtenez de garder tous vos profils en un seul endroit sur le web.config.
C'est également publié dans la question connexe: https://stackoverflow.com/a/13866280/1373170
OriginalL'auteur Pablo Romeo
Dans certains cas, il peut être approprié de créer un deuxième méthode d'action, avec le cache désactivé qui est appelé par votre action principale.
Quand vous en avez besoin
Html.Action
vous suffit d'appeler _Foo au lieu de Foo.Vous pouvez alors compter sur la page parent à faire de la mise en cache.
Une autre façon consiste à contourner l'ensemble CacheProfile chose pour ActionMethod et l'utilisation mon DonutCacheAttribute' à la place.
Le "CacheProfile" pour ActionMethods actuellement respecte la
Duration
etvaryByParam
propriétés - et cette méthode, il est facile de définir différents de la mise en cache des durées en debug vs déploiement (en supposant que vous êtes en utilisant XDT transformations).OriginalL'auteur Simon_Weaver