[英]C# Razor - Display value from list based on key
我试图根据键显示列表中的一些文本:
<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,我希望它从SummaryOutcomes获得相关的文本,键为7。
第二行给我以下错误: 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?
谢谢
非常感谢fourpastmidnight对他的一贯帮助,不仅帮助我找到了解决方案,还帮助我确切地了解了问题的根源。 这是一个更新的(有效的)解决方案:
@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>
}
FirstOrDefault将只执行返回与谓词匹配的第一个元素或返回default的操作,即null 。 在空对象上调用.Name将抛出NullReferenceException
总之,如果枚举SummaryOutcomes中没有Category实例的值为7,则会发生您描述的行为。
好的,问题是您正在尝试将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.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.