自定义剃刀每个视图
本文关键字:视图 剃刀 自定义 | 更新日期: 2023-09-27 18:06:54
我在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
this my view model
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 i use 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>();
有人知道这个吗??任何参考、建议都会有所帮助。谢谢!
您应该将自定义ViewModel传递给视图,而不是在razor视图中自定义或编写任何逻辑。您可以使用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, typeBook = "Horror"和bookName = "Scary, Spooky"作为你需要显示。
所以在你的视图中你可以像现在一样使用它。现在你只需要将ViewModel传递给视图
当您在控制器中分配模型时,您必须将查询实现为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);