我在cshtml页面中查看了一些问题.. 我已经定义了这样的foreach
<table>
<tr>
<th>Type</th>
<th>Name</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td> @Html.DisplayFor(modelItem => item.typeBook)</td>
<td> @Html.DisplayFor(modelItem => item.bookName)</td>
<tr>
}
</table>
和视图
Type | Name
Horror | Scary
Horror | Spooky
Jokes | Bean
但我想要这样的观点..
Type | Name
Horror | Scary , Spooky
Jokes | Bean
这是我的视图模型
public class BookViewModel
{
[DataMember]
public int IdBook { get; set; }
[DataMember]
[DisplayName("type Book")]
public string typeBook { get; set; }
[DataMember]
[DisplayName("book Name")]
[Required]
public string bookName { get; set; }
}
for select to database我使用linq Exp
Expression<Func<Book, bool>> criteria = c => c.IdBook == (int)IdBook ;
IOrderedEnumerable<BookViewModel> result = this.GetList(criteria).OrderBy(o => o.typeBook);
return result.ToList<BookViewModel>();
任何人都可以对此有所了解吗?任何参考,消化将有所帮助..谢谢!
答案 0 :(得分:1)
您应该将自定义ViewModel传递给视图,而不是在剃刀视图中自定义或编写任何逻辑。 您可以使用GroupBy查询从列表中创建自定义ViewModel字段。 视图应仅包含渲染语法。
在控制器内部,使用以下代码更新您的方法:
// books is your original model data
var bookListViewModel = books.GroupBy(b => b.typeBook)
.Select(b => new BookViewModel()
{
type = b.Key,
name = string.Join(",", b.Select(book => book.bookName))
});
所以现在你需要在BookViewModel中输入book =“Horror”和bookName =“Scary,Spooky”。
因此,在您的视图中,您可以像使用它一样使用它。您现在必须将ViewModel传递给您的视图。
答案 1 :(得分:0)
在控制器中分配模型时,必须将查询实现为group by Type
e.g.
var query = BookViewModel.
Orderby(x =>x.bookName).
GroupBy(x =>x.Type);
进一步查询三个字段
var query = BookViewModel.
Orderby(x =>x.bookName).
GroupBy(x =>x.Type, n => n.Writer);