C#Razor - 根据键显示列表中的值

时间:2014-03-20 14:07:55

标签: c# asp.net-mvc-3 razor

我试图根据密钥显示列表中的某些文字:

<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);
}

最后,您可以看到列表已填充并初始化:

enter image description here

无论如何得到它而不是显示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>
}

2 个答案:

答案 0 :(得分:2)

FirstOrDefault 只会返回匹配谓词或返回默认值的 first 元素,即 null 。在 null 对象上调用 .Name 将抛出 NullReferenceException

总而言之,如果枚举 SummaryOutcomes 中的 Category 的实例的值为7,则会出现您所描述的行为。

答案 1 :(得分:1)

好的,问题是您要将stringint进行比较。

按如下方式更改第二行:

@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.