繁体   English   中英

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

[英]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,则会发生您描述的行为。

好的,问题是您正在尝试将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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM