【问题标题】:Using string.IsNullOrEmpty on a potential string in Razor in Umbraco在 Umbraco 的 Razor 中对潜在字符串使用 string.IsNullOrEmpty
【发布时间】:2012-12-17 23:59:31
【问题描述】:

我正在使用一种简单的方法来输出图像,如果媒体类型附加了链接,它将充当链接。这种方法已经使用了几个月又几个月,但突然有客户抱怨它不起作用。

我的 razor 宏整体如下所示:

@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>

    }
}

它会产生这两个错误:

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

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)

我怀疑图像本身是原因的根源,但媒体图像绝对应有的样子,我看不出有什么不同。并且添加到奇怪的因素 - 宏与任何其他图像完美配合。失败的图片可以是found here

编辑:

出于某种奇怪的原因,如果我按照 Douglas 的建议在图像上执行 GetType(),它会返回一个 Umbraco.MacroEngines.DynamicXml 对象,而它在任何其他图像上都会返回一个字符串。它只会越来越奇怪。

第二次编辑:

我决定放弃代码并使用 Kevin Hendricks 建议的技术重写整个内容。现在突然之间,我没有收到任何错误,而且效果很好。唯一的区别是几个.ToString() 几个地方。

【问题讨论】:

  • 您在链接的属性名称中使用“下划线”是否有原因?您意识到这将递归搜索具有关联的“链接”属性的节点吗?您可以做的一件事是输出 razor 引擎认为属性为的类型:@topImage._link.GetType()
  • 不,我不知道这一点。出于某种原因,属性名称中的下划线似乎在 getPropertyValue 不起作用时起作用

标签: c# string razor umbraco


【解决方案1】:

这听起来很愚蠢,但您可能想将 var linkId 转换为字符串。如果出于某种原因,通用 var 对象将其视为整数、Uri 或不同,则会出现此类问题

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

}

喜欢:

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

}

【讨论】:

  • 您也可以作为代码的读者看不到 topImage._link 是什么类型。我会使用,它可能是一个 Uri,等等: var topImage = Library.MediaById(topImageId);字符串链接 ID = topImage._link.ToString(); if (!string.IsNullOrEmpty(linkId)) { }
  • 我用更多细节更新了这个问题。在大多数情况下它恰好是一个字符串,但在这种奇怪的情况下,它是一个 DynamicXml
  • 我找到了这篇文章。在某些情况下,这似乎来自 Umbraco 的一个已知问题,我还发现了很多类似的帖子,搜索返回的 dynamicxml 而不是字符串可能会有所帮助。示例:our.umbraco.org/m?mode=topic&id=19368
猜你喜欢
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多