如何在我的视图中只显示不同的名称(来自我的模型)?
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 => x.name)
时,QuoteDB
对象的概念丢失了 - 您现在有了一个 IEnumerable<string>
@Jonesy 对,我正在调查这个错误,你可以看到我尝试修复它,但仍然得到奇怪的输出?
另外,如果您使用不同的名称实现IEnumerable<QuoteDB>
,您希望 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以上是关于如何在我的视图中只显示不同的名称(来自我的模型)?的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的ASP.NET Core应用程序中显示来自我的Azure Blob存储帐户的图像?