自定义剃刀每个视图

本文关键字:视图 剃刀 自定义 | 更新日期: 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);