【问题标题】:Custom Razor ForEach View自定义 Razor ForEach 视图
【发布时间】:2014-06-05 07:10:05
【问题描述】:

我在 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; }


    }

为了选择数据库,我使用 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>();

任何人都可以对此有想法吗?任何参考,建议都会有所帮助..谢谢!

【问题讨论】:

  • 您最好的方法是制作一个已经具有您想要的输出的模型,然后使用该模型来构建表格。在你看来,你不会在你的 foreach 循环和 LINQ 中挣扎。
  • 我认为您的模型需要更改。你的模型看起来怎么样?
  • 您应该使用 linq 查询来区分和分组以获取更多信息:stackoverflow.com/questions/20582391/…
  • 在控制器中使用 GroupBy 查询
  • 我更新了有问题的视图模型

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


【解决方案1】:

您应该将自定义 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 传递给您的视图。

【讨论】:

  • 这正是我在上面的 cmets 中提出的。
  • 也许可以使用 groupby 如果只有 2 个值我的意思是 typeBook,nameBook 但如果 3 个值如 typeBook,Writer,NameBook 则不能使用 group by。
  • @user3645707 我没听懂你,你能告诉我你想如何在视图中显示数据。
  • 我已经在 Ling Expresion 中使用了 group by,但可以查看我想要的问题,这与类型无关,但我希望书不重复 就像 @ Html.DisplayFor(modelItem => item.bookName),用逗号隔开
  • @user3645707 请查看更新的答案,我已经编写了如何使用 GroupBy 查询创建视图模型的代码。希望能帮助到你。如果有帮助,请将答案标记为已接受。
【解决方案2】:

当您在控制器中分配模型时,您必须将查询实现为 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2012-02-12
    • 2015-02-13
    • 1970-01-01
    相关资源
    最近更新 更多