自定义Razor ForEach视图

时间:2014-06-05 07:10:06

标签: c# linq asp.net-mvc-4 razor foreach

我在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>();

任何人都可以对此有所了解吗?任何参考,消化将有所帮助..谢谢!

2 个答案:

答案 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);