2016-02-26 74 views
6

我试图在Razor语法中使用Sitecore的Field.HasValue属性来测试特定的字段,但无论我尝试什么,该字段总是似乎是错误的。Sitecore的Field.HasValue返回false,即使有值时也是如此?

  • 我使用Sitecore的8
  • 的Sitecore的领域,“头数”是单行文本字段

这里就是我想:

@{ 
    var phoneNumber = ""; 
    var numberField = Model.Item.Fields["Header Number"]; 
    if (numberField != null && numberField.HasValue) 
    { 
     phoneNumber = numberField.Value; 
    } 
} 

正如你可以在下面的截图中看到的:

  • numberField被正确设定为Sitecore的字段
  • numberField.HasValue被(正确地)报告false
  • 然而numberField.Value是由于未能触发if块的返回领域
  • 的值,phoneNumber是从未设置:

Screenshot of Breakpoint showing variable values

这是一个错误?我错误地使用HasValue还是有另一个Sitecore方法我应该用来安全地测试字段是否有值?

+0

你不能在你的if区块中检查'!String.IsNullOrEmpty(numberField)'吗? – jammykam

+0

@jammykam - 我可能这次看到它是一个String,但我更担心Sitecore支持的更复杂的数据类型,并且我在其他地方使用'.HasValue'。 – Robotnik

回答

4

该字段的大部分值可能来自标准值项目(是继承的)。

HasValue属性只在项目本身设置值时才返回true。

这里是HasValue属性的实现:

public bool HasValue 
{ 
    get 
    { 
    return this.GetValue(false, false) != null; 
    } 
} 

public string GetValue(bool allowStandardValue, bool allowDefaultValue) 
{ 
    ... 
} 

您可以检查ContainsStandardValue属性来检查值来自标准值。

+0

它*确实来自标准值...哎,谢谢你,以为我失去了我的想法:)。是否有一种首选的方法来测试字段是否具有任何价值,即使它是标准值? – Robotnik

+1

@Robotnik我认为'ContainsStandardValue'属性应该做的伎俩。 –

+0

@MarekMusielak - 你是一个传奇谢谢:)。一旦系统让我接受(你很快它仍然在15分钟窗口哈哈) – Robotnik

相关问题