2013-01-03 3 views
4

J'utilise une méthode simple pour sortir une image, et si le type de média a un lien attaché, il agira comme un lien. Cette méthode a fonctionné pendant des mois et des mois, mais soudainement, un client s'est plaint que cela ne fonctionnait pas.Utilisation de string.IsNullOrEmpty sur une chaîne potentielle dans Razor dans Umbraco

Ma macro rasoir dans son ensemble ressemble à ceci:

@using umbraco.MacroEngines 
@inherits umbraco.MacroEngines.DynamicNodeContext 

@{ 
    var topImageId = Model._topImage; 

    if (topImageId != null) { 

     var topImage = Library.MediaById(topImageId); 
     var linkId = topImage._link; 
     string cssStyle = string.Format("background-image:url({0});height:{1}px;", topImage.umbracoFile, topImage.umbracoHeight); 

     <div id="topImage" 

     @if(!string.IsNullOrEmpty(linkId)){ 

      var tempNode = @Model.NodeById(linkId); 
      @Html.Raw(string.Format(" onclick=\"window.location.href='{0}'\"", @tempNode.Url)); 

      cssStyle += " cursor: pointer;"; 
     } 

     @Html.Raw(string.Format("style=\"{0}\"", cssStyle)) 

     ></div> 

    } 
} 

et produit ces deux erreurs:

Error Loading Razor Script (file: Top Image) The best overloaded method match for 'string.IsNullOrEmpty(string)' has some invalid arguments at CallSite.Target(Closure , CallSite , Type , Object) 
    at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1) 
    at ASP._Page_macroScripts_general_topImage_cshtml.Execute() in d:\inetpub\wwwroot\friendtex.com\www\macroScripts\general\topImage.cshtml:line 15 
    at System.Web.WebPages.WebPageBase.ExecutePageHierarchy() 
    at System.Web.WebPages.WebPage.ExecutePageHierarchy(IEnumerable`1 executors) 
    at System.Web.WebPages.WebPage.ExecutePageHierarchy() 
    at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) 
    at umbraco.MacroEngines.RazorMacroEngine.ExecuteRazor(MacroModel macro, INode currentPage) 
    at umbraco.MacroEngines.RazorMacroEngine.Execute(MacroModel macro, INode currentPage) 0.741249 0.004230 

et

Error loading MacroEngine script (file: /general/topImage.cshtml, Type: '' 
The best overloaded method match for 'string.IsNullOrEmpty(string)' has some invalid arguments 
    at umbraco.macro.renderMacro(Hashtable pageElements, Int32 pageId) 

Je me doutais bien l'image elle-même être la racine de la cause, mais l'image médiatique est absolument comme il se doit et je ne vois pas de différence. Et pour ajouter au facteur bizarre - la macro fonctionne parfaitement avec n'importe quelle autre image. L'image qui ne peut être found here

EDIT:

Pour une raison étrange, si je GetType() sur l'image que Douglas a suggéré, et il retourne un objet Umbraco.MacroEngines.DynamicXml, où sur une autre image renvoie une chaîne. Il continue juste à devenir plus étrange et plus étrange.

EDIT DEUXIÈME:

j'ai décidé de lancer le code à réécrire et toute la chose en utilisant la technique Kevin Hendricks a suggéré. Maintenant, tout d'un coup, je n'ai pas d'erreurs et ça fonctionne parfaitement. La seule différence est un couple de .ToString() quelques endroits.

+1

Y at-il une raison que vous utilisez « underscore » dans le nom de la propriété pour le lien? Vous vous rendez compte que cela recherchera récursivement un noeud auquel la propriété "link" est associée? Une chose que vous pouvez faire pour le dépannage est de sortir le type que le moteur de rasoir pense que la propriété est: '@ topImage._link.GetType()'. –

+0

Non, je n'étais pas au courant de cela. Pour une raison quelconque, les traits de soulignement dans les noms de propriété semblent fonctionner lorsque 'getPropertyValue' ne le fait pas –

Répondre

7

Cela semble stupide, mais vous pourriez vouloir convertir le var linkId en une chaîne. Si pour une raison quelconque l'objet var générique qu'il considère comme un entier, Uri ou différents, que des problèmes tels que ceux-ci arrise

var topImage = Library.MediaById(topImageId); 
var linkId = topImage._link; 
if (!string.IsNullOrEmpty(linkId.ToString())) 
{ 

} 

Préférez:

var topImage = Library.MediaById(topImageId); 
string linkId = topImage._link.ToString(); 
if (!string.IsNullOrEmpty(linkId)) 
{ 

} 
+1

Aussi, vous pouvez en tant que lecteur du code ne pas voir quel type de type topImage._link est. Je voudrais utiliser, il pourrait être un Uri, etc .: var topImage = Library.MediaById (topImageId); string linkId = topImage._link.ToString(); if (! String.IsNullOrEmpty (linkId)) { } –

+0

J'ai mis à jour la question avec des détails supplémentaires. Il se trouve être une chaîne dans la plupart des cas, mais dans ce cas bizarre, c'est un 'DynamicXml' –

+0

J'ai trouvé cet article. Il semble être d'un problème connu avec Umbraco dans certains cas, j'ai également trouvé beaucoup de messages simulair, la recherche de dynamicxml retourné instaid de chaîne pourrait aider. Exemple: http://our.umbraco.org/m?mode=topic&id=19368 –

Questions connexes