试图在“ViewData”中使用逻辑“OR”

时间:2014-09-17 21:14:06

标签: asp.net-mvc

我遇到的情况是我使用ViewData将参数传递给部分视图,但有时不需要传递参数。在那种情况下,我只是希望它回到默认状态。

所以实际的View 通常看起来像这样......

<div>
   @Html.Partial( "templates/form/slots", new ViewDataDictionary { { "slots", "First.Slots" } })
</div>

然后正在渲染的部分看起来像这样......

<div class="form-group">
   <h3>Slots</h3>
   <!-- lots of other happy HTML -->
   <select ng-model="@ViewData["slots"]"></select>
</div>

令人惊讶的是,这很好用。但我对||语法有点疑虑。如果没有给ViewData赋值,我希望它回到默认值"Model.Slots"。我认为那会像......一样简单。

<select ng-model="@( ViewData["slots"] || "Model.Slots" )"></select>

但是这并没有奏效,引用错误......

  

&#39; ||&#39;运算符不能应用于&#39; object&#39;和&#39;字符串&#39;。

我知道我已经接近了,我只是在努力研究关于剃刀的确切语法。有没有办法在没有扭曲和使用全尺寸扩展方法的情况下获得这种表达式?

1 个答案:

答案 0 :(得分:1)

您要找的是null coalescing operator,而不是逻辑或。

<select ng-model="@( ViewData["slots"] ?? "Model.Slots" )"></select>

与构造object || default合法的Javascript(和其他动态语言)不同,C#的输入系统不允许它,因为它需要布尔操作数。虽然??运算符可以执行您想要的操作,但如果第一个操作数为null,它将回退到第二个操作数。