2016-07-20 56 views
0

为什么当它在剃刀使用String.Trim()略知string.empty的除外图所示:String.Trim()在Razor视图

console.log('@Model.Test.FirstOrDefault().Trim()'); 

(列表是空的,所以我得到string.empty),然后:

Server Error in '/' Application. 
Object reference not set to an instance of an object. 
(...)' 
Line 326:   console.log('@Model.Test.FirstOrDefault().Trim()'); 
+0

你可能会调用修剪上的空 – Adil

+4

最有可能的'FirstOrDefault'正在产生'null',而不是一个空字符串。 – npinti

+0

console.log('result:'+'@ Model.Institution.FirstOrDefault()');在控制台中给我:'result:' – Carlos28

回答

4

如果该列表是空的,因为你说,你不会得到一个string.Empty而是空,以字符串空列表的第一个元素的默认值是null,你不能叫.Trim()上一个空对象。

如果您使用的是C#6,那么你可以做这样的事情:

console.log('@Model.Test.FirstOrDefault()?.Trim()'); 

注意加一个问号的.Trim()之前,即把一个空检查中,这样修剪才会被调用,如果左侧不为空。

或者你可以这样做:

console.log('@(Model.Test.FirstOrDefault() ?? string.Empty).Trim()'); 

这是使用空合并运算符与一个string.Empty明确更换空,并在C#

0

以前的版本,你可能会有null地方。您可以通过在C#中使用6操作elvis容易克服它:

console.log('@Model.Test?.FirstOrDefault()?.Trim()??"Null property"'); 
+0

不要过度使用?运营商 - 它可能导致错误的代码。只有在你知道会有一个你想要以特定方式处理的空值时才使用它。 –

+0

我不认为这是过度使用。 该行很清楚。他希望将字符串值用于某些内容,并且必须检查null值。在没有需要的时候,Elvis操作员可以跳过很多不需要的代码来进行空值检查 –

+0

你知道可能的null在哪里(在'.FirstOrDefault()'之后)你已经使用过的其他地方没有被标识为返回值是一个null或者它是有用的,因为你强迫自己进入那个角落 - 它不会(或不应该)返回null,你不应该检查它,因为你会隐藏错误。您的回答和后续评论充分说明了为什么我认为对语言的这种补充是一个糟糕的主意。你过度使用它,你看不到你是。你所做的只是重新创建旧的VB OnErrorContinue场景。 –