如何在我的视图中只显示不同的名称(来自我的模型)?

Posted

技术标签:

【中文标题】如何在我的视图中只显示不同的名称(来自我的模型)?【英文标题】:How can I show just distinct names (from my model) in my view? 【发布时间】:2014-10-07 18:41:22 【问题描述】:

问题

如何才能只返回视图中的不同名称?我无法将 distinct() 方法返回的字符串转换回 Inumerable 对象。

为简单起见,如果您在数据库中看到一个名叫 John Smith 的人,我们假设 John Smith 的所有引用都来自同一个人。

代码

数据

id                name          quote
1                 Finn          Mathematical
2                 Jake          Aw, man! 
3                 Shredder      Tonight, I dine on turtle soup. 
4                 Shredder      Nooooo

型号

    namespace Quotes_Sample.Models

    public class QuoteDB
    

        public int Id  get; set; 
        public string name  get; set; 
        public string quote  get; set; 
        public bool IsSelected  get; set; 

    


    public class QuoteDBContext : DbContext
    
        public DbSet<QuoteDB> Quotes  get; set; 
    



控制器

 private QuoteDBContext db = new QuoteDBContext();

    // GET: Quotes
    public ActionResult Index()
    
        return View(db.Quotes.ToList());
    

查看

@model IEnumerable<Quotes_Sample.Models.QuoteDB>

@
    Layout = null;


<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <p>
        @Html.ActionLink("Create New", "Create")
    </p>
    @using (Html.BeginForm("SubmitSelected", "Quotes", FormMethod.Post, new  encType = "multipart/form-data", name="myform"))
    

        <table class="table">
            <tr>
                <th>
                   @Html.DisplayNameFor(model => model.name)
                </th>
            </tr>
            @foreach (var item in (IEnumerable<Quotes_Sample.Models.QuoteDB>)Model.Select(x => x.name).Distinct())
            
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.name)
                    </td>
                </tr>
            
        </table>

    

</body>
</html>

错误

An exception of type 'System.InvalidCastException' occurred in App_Web_cied5w21.dll but was not handled in user code
Additional information: Unable to cast object of type '<DistinctIterator>d__81`1[System.String]' to type 'System.Collections.Generic.IEnumerable`1[Quotes_Sample.Models.QuoteDB]'.

尝试

我可以删除铸件并有重复,但它真的 丑陋。 我想过写一个能记住最后的临时变量 循环中的名称,如果相同则中断。这简直太恶心了?似乎也很hacky。 我的数据库中只有 1 个名称到 1 个引用关系,但这完全避免了这个问题。 This,这实际上让我遇到了这个问题。

下面这个:

<table class="table">
    <tr>
        <th>
           @Html.DisplayNameFor(model => model.name)
        </th>
    </tr>
    @foreach (string name in Model.Select(x => x.name).Distinct())
    
        <tr>
            <td>
                @Html.DisplayText(name);
            </td>
        </tr>
    
</table>

但这真的让我很奇怪。它给了我以下信息:

name 

;  
;  
; 

感谢您的耐心和帮助。

【问题讨论】:

您的问题是当您调用 Model.Select(x =&gt; x.name) 时,QuoteDB 对象的概念丢失了 - 您现在有了一个 IEnumerable&lt;string&gt; @Jonesy 对,我正在调查这个错误,你可以看到我尝试修复它,但仍然得到奇怪的输出? 另外,如果您使用不同的名称实现IEnumerable&lt;QuoteDB&gt;,您希望 Shredder 具有什么报价值?我想你正在寻找GroupBy 【参考方案1】:

您可以使用以下方法按名称获取Distinct 记录:

Model.GroupBy(x => x.name).Select(x => x.First())

但您应该在您的 Controller 中执行此操作,而不是 View

你也可以使用DistinctBy方法:

Model.DistinctBy(x => x.name)

【讨论】:

这行得通。请再发表评论。这个逻辑属于控制器的原因有两个。 1. 控制器处理数据,然后按定义传递给视图。 2. 在视图中这样做会很慢而且很讨厌。 View 的目的是显示数据,所有其他的东西(过滤、投影等)都应该在 Contoller 中完成。 在这里进行完整性检查。按型号,您的意思是 QuoteDBContext 数据库,是吗? 不,它是 ViewModel,但如果你要在控制器中执行此操作,当然需要使用 DbContext

以上是关于如何在我的视图中只显示不同的名称(来自我的模型)?的主要内容,如果未能解决你的问题,请参考以下文章

现代 OpenGL 投影视图模型转换不起作用

显示数组中的月份名称

如何在我的ASP.NET Core应用程序中显示来自我的Azure Blob存储帐户的图像?

Rails:使用范围来显示模型的不同子集以及如何以较少 DRY 的方式构建它?

在列表视图中查找按钮的位置

在列表视图中查找 Imageview 的位置