我试图根据密钥显示列表中的某些文字:
<td>@x.OutcomeSummary</td>
<td>@Model.SummaryOutcomes.FirstOrDefault(c => c.Value == x.OutcomeSummary).Name</td>
<td>@Model.SummaryOutcomes.FirstOrDefault(x.OutcomeSummary).Name</td>
在这种情况下,x.OutcomeSummary
为7,我希望它能够使用7的密钥从SummaryOutcomes获取相关文本。
第二行给出了以下错误: System.NullReferenceException:对象引用未设置为对象的实例。
第三行给出了一个错误,指出FirstOrDefault命令有无效的参数。
导入以下模型:
public class DogSummaryView
{
public IEnumerable<DogIncident> Incidents { get; set; }
public IEnumerable<Category> SummaryOutcomes { get; set; }
public IEnumerable<Category> DogBreeds { get; set; }
}
这是类别类:
public class Category
{
public string Value { get; set; }
public string Name { get; set; }
public bool InUse { get; set; }
}
这是控制器:
public ActionResult Summary()
{
var vm = new DogSummaryView
{
Incidents = repository.GetAllRecords().OrderByDescending(x => x.DateRecieved),
SummaryOutcomes = repository.GetAllSummaryOutcomes()
};
return View("Summary", vm);
}
最后,您可以看到列表已填充并初始化:
无论如何得到它而不是显示7,它会显示正确的摘要结果吗?
由于
非常感谢四周晚上对他的持续帮助,不仅帮助我找到解决方案,还帮助我理解问题的确切位置。这是一个更新的(工作!)解决方案:
@foreach (var x in Model.Incidents)
{
var summaryOutput = "";
var firstOutcomeSummary = Model.SummaryOutcomes.FirstOrDefault(c => c.Value == x.OutcomeSummary);
if (firstOutcomeSummary != null) { summaryOutput = Model.SummaryOutcomes.FirstOrDefault(c => c.Value == x.OutcomeSummary).Name.ToString(); }
<tr>
<td>@Html.Raw(summaryOutput)</td>
</tr>
}
答案 0 :(得分:2)
FirstOrDefault 只会返回匹配谓词或返回默认值的 first 元素,即 null 。在 null 对象上调用 .Name 将抛出 NullReferenceException
总而言之,如果枚举 SummaryOutcomes 中的 Category 的实例的值为7,则会出现您所描述的行为。
答案 1 :(得分:1)
好的,问题是您要将string
与int
进行比较。
按如下方式更改第二行:
@Model.SummaryOutcomes.FirstOrDefault(c => c.Value == x.OutcomeSummary.ToString()).Name;
// You could also use '.Value'.
这应该可以解决你的问题。
<强>更新强>
嗯,也许x.OutcomeSummary.ToString()
导致枚举的类型名称,而不是枚举常量值的整数值。
尝试将以上行更新为以下内容:
@Model.SummaryOutcomes.FirstOrDefault(c => c.Value == ((int)x.OutcomeSummary).ToString()).Name;
更新2014-03-21
根据OP的最新评论,请尝试以下方法:
// If x.OutcomeSummary is the outcome summary name, then....
var firstOutcomeSummary = @Model.SummaryOutcomes.FirstOrDefault(c => c.Name == x.OutcomeSummary)
if (firstOutcomeSummary != null)
// Do something here.
// Else, if x.OutcomeSummary is the outcome summary value, e.g. "7", then...
var firstOutcomeSummary = @Model.SummaryOutcomes.FirstOrDefault(c => c.Value == x.OutcomeSummary)
if (firstOutcomeSummary != null)
// Do something here.