【问题标题】:having Error returning this anonymous to the view将此匿名返回到视图时出错
【发布时间】:2018-07-10 21:29:27
【问题描述】:

[1] 我想将匿名列表传递给视图,但我觉得很难 请帮我写代码:

我的模型为:

namespace OpenOrderFramework.Models
{
    [Bind(Exclude = "ID")]
    public class Item
    {
        private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
        [Key]
        [ScaffoldColumn(false)]
        public int ID { get; set; }

        [DisplayName("Catagorie:")]
        public int CatagorieId { get; set; }
        [Required(ErrorMessage = " Item name cannot be empty, this is required")]
        [DisplayName("Item Name")]
        public string ItemName { get; set; }
        [DisplayName("GRC TAG")]
        public string GRCTag { get; set; }
        [DisplayName("Location:")]
        public int LocationId { get; set; }
        [DisplayName("Item Name:")]
        public int itemnameId { get; set; }

        [Required(ErrorMessage = "Quantity of item in a Location is required!")]
        [DisplayName("Quantity in Store:")]
        public int ItemQty { get; set; }
        public DateTime DateCreated { get; set; }

控制器是:

private ApplicationDbContext db = new ApplicationDbContext();
        // GET: Items
        public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page)
        {                      
            ViewBag.CurrentSort = sortOrder;
            ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "Name";
            ViewBag.PriceSortParm = sortOrder == "Name" ? "Loc_desc" : "Location";
            IEnumerable<Item> items = db.Items;
           var ko= (from r in items.GroupBy(x => new { x.Catagorie, x.ItemName })
                                  .Select(g => new 
                                  {
                                      Catagorie = g.Key.Catagorie.Name,
                                      ItemName = g.Key.ItemName,
                                      ItemQty = g.Sum(s => s.ItemQty),
                                      Location = g.First().Location.Name

                                  })
                         select r).ToList();


                if (!string.IsNullOrWhiteSpace(searchString))
                {
                    items = items.Where(s => s.ItemName.Contains(searchString.ToUpper())
                                               || s.Catagorie.Name.ToUpper().Contains(searchString.ToUpper()) ||
                                               s.Location.Name.ToUpper().Contains(searchString.ToUpper())).ToList().ToPagedList(page ?? 1, 20);
                    //}

                }
                else
                {
                    items = items.ToList().ToPagedList(page ?? 1, 10);
                }

            return View(ko.ToList().ToPagedList(page ?? 1, 20));

        }

视图是:

@model PagedList.IPagedList<OpenOrderFramework.Models.Item>
@using PagedList.Mvc;
@using PagedList;

<table class="table">
    <tr>
        <th>
            Catagory
        </th>
       <th>
            Item Name.
        </th>
 <th>
            Quantity.
        </th>

 @foreach (var item in Model)
    {
        <tr>
            <td>
                <font color="RED">
                @Html.DisplayFor(modelItem => item.Catagorie.Name)
                </font>
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ItemName)
            </td>            
            <td>
                @Html.DisplayFor(modelItem => item.ItemQty)
            </td>

[2] 请帮我编写代码并将过滤后的列表返回给视图。 尝试了很多但没有工作..得到这个错误

传入字典的模型项的类型是'PagedList.PagedList'1[f__AnonymousType7`4[System.String,System.String,System.Int32,System.String]]',但是这个字典需要一个'PagedList.IPagedList'1[OpenOrderFramework.Models.Item]' 类型的模型项

请帮助我将匿名列表返回到我的 iagedlist 的代码

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    在您的视图更改中:

    @model PagedList.IPagedList&lt;OpenOrderFramework.Models.Item&gt;

    @model PagedList.IPagedList&lt;dynamic&gt;

    【讨论】:

      【解决方案2】:

      你的观点在第一行...

      @model PagedList.IPagedList<OpenOrderFramework.Models.Item>
      

      您应该作为参数传递给 View() 调用的对象需要具有这种类型...

      不支持在 razor 视图中将匿名对象作为模型,您可以将它们视为动态对象,但您会放松编译时检查(您不应该这样做)

      代替匿名对象,为您的视图创建模型或视图模型对象并将它们移交,也许您可​​以为此重用项目类

      编辑:

      你想要一个代码示例...

      问题从你的匿名类型开始......

                                       .Select(g => new 
                                        {
                                            Catagorie = g.Key.Catagorie.Name,
                                            ItemName = g.Key.ItemName,
                                            ItemQty = g.Sum(s => s.ItemQty),
                                            Location = g.First().Location.Name
      
                                        })
      

      创建一个名称适合您当前命名约定和应用程序架构的新类: 该类将保存不代表数据库中的实体但代表分组聚合结果的数据。如果该数据仅用于该一个视图,则它有资格作为视图模型......当您不确定该类属于应用程序中的哪个层时,将其视为数据传输对象或 DTO

      在本例中,我将其称为 ItemSumDTO,它与您的匿名类型具有相同的属性

      不是在上面的选择中创建匿名类型的对象,而是创建 ItemSumDTOs

      .Select(g => new 
      

      变成

      .Select(g => new ItemSumDTO
      

      如果你的 ORM 对那个替换有问题,此时坚持使用 anon 对象,然后在调用 .ToList() 之后引入另一个 .Select(x=&gt; new ItemSumDTO{Catagorie = x.Catagorie, ItemName = x.ItemName, ItemQty = x.ItemQty, Location = x.Location})

      在您的视图中,将 @model 定义更改为 PagedList.IPagedList&lt;ItemSumDTO&gt;

      【讨论】:

      • 我将视图更改为动态,但仍然报错
      • 因为无论如何你都不应该这样做,我认为使用普通模型或视图模型类应该可以解决问题......
      猜你喜欢
      • 2018-02-06
      • 2021-08-19
      • 2020-12-09
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多