【问题标题】:Show all history records for a particular Model.Id on Edit() View?在 Edit() 视图上显示特定 Model.Id 的所有历史记录?
【发布时间】:2015-03-24 00:15:36
【问题描述】:

在我的库存跟踪程序中,每当有人打开 Edit() 视图时,我都会尝试显示资产的所有历史记录。我的应用程序有 2 个相关模型 INV_AssetsINV_AssetsHistory

INV_Assets

namespace InventoryTracker.Models
{
    [GridTable(PagingEnabled = true, PageSize = 30)]
    public class INV_Assets 
    {
        // Setting GridColumn Annotations allows you to use AutoGenerateColumns on view to auto create the Grid based on the model.


        public int Id { get; set; }

        public virtual ICollection<INV_AssetsHistory> AssetHistoryRecords { get; set; }

        public int Model_Id { get; set; }
        [ForeignKey("Model_Id")]
        public virtual INV_Models Model { get; set; }

        [Required]
        public int Manufacturer_Id { get; set; }
        [ForeignKey("Manufacturer_Id")]
        public virtual INV_Manufacturers Manufacturer { get; set; }

        [Required]
        public int Type_Id { get; set; }
        [ForeignKey("Type_Id")]
        public virtual INV_Types Type { get; set; }

        [Required]
        public int Location_Id { get; set; }
        [ForeignKey("Location_Id")]
        public virtual INV_Locations Location { get; set; }

        public int Vendor_Id { get; set; }
        [ForeignKey("Vendor_Id")]
        public virtual INV_Vendors Vendor { get; set; }

        [Required]
        public int Status_Id { get; set; }
        [ForeignKey("Status_Id")]
        public virtual INV_Statuses Status { get; set; }

        public string ip_address { get; set; }

        public string mac_address { get; set; }

        [DataType(DataType.MultilineText)]
        public string note { get; set; }
        public string owner { get; set; }

        //[DataType(DataType.Currency)]
        //[DisplayFormat(DataFormatString="{0:C}", ApplyFormatInEditMode=true)]
        [DisplayFormat(DataFormatString = "{0:#,###0.00}", ApplyFormatInEditMode=true)]
        public decimal cost { get; set; }
        public string po_number { get; set; }

        [DataType(DataType.MultilineText)]
        public string description { get; set; }

        public int invoice_number{ get; set; }

        [Required]
        public string serial_number { get; set; }

        [Required]
        public string asset_tag_number { get; set; }

        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        public DateTime? acquired_date { get; set; }

        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        public DateTime? disposed_date { get; set; }

        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        public DateTime? verified_date { get; set; }

        [Required]
        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        public DateTime created_date { get; set; }

        [Required]
        public string created_by { get; set; }

        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")]
        public DateTime? modified_date { get; set; }

        public string modified_by { get; set; }

        // Flag to specify if item is available? (Not signed out, not auctioned, recycled, etc.)
        //public bool available { get; set; }
    }
}

INV_AssetsHistory

namespace InventoryTracker.Models
{
    public class INV_AssetsHistory
    {
        public int Id { get; set; }

        [Required]
        public int AssetId { get; set; }
        //public virtual INV_Assets INV_Asset { get; set; }

        public int Model_Id { get; set; }
        [ForeignKey("Model_Id")]
        public virtual INV_Models Model { get; set; }

        [Required]
        public int Manufacturer_Id { get; set; }
        [ForeignKey("Manufacturer_Id")]
        public virtual INV_Manufacturers Manufacturer { get; set; }

        [Required]
        public int Type_Id { get; set; }
        [ForeignKey("Type_Id")]
        public virtual INV_Types Type { get; set; }

        [Required]
        public int Location_Id { get; set; }
        [ForeignKey("Location_Id")]
        public virtual INV_Locations Location { get; set; }

        public int Vendor_Id { get; set; }
        [ForeignKey("Vendor_Id")]
        public virtual INV_Vendors Vendor { get; set; }

        [Required]
        public int Status_Id { get; set; }
        [ForeignKey("Status_Id")]
        public virtual INV_Statuses Status { get; set; }

        public string ip_address { get; set; }

        public string mac_address { get; set; }

        [DataType(DataType.MultilineText)]
        public string note { get; set; }
        public string owner { get; set; }

        //[DataType(DataType.Currency)]
        //[DisplayFormat(DataFormatString="{0:C}", ApplyFormatInEditMode=true)]
        [DisplayFormat(DataFormatString = "{0:#,###0.00}", ApplyFormatInEditMode = true)]
        public decimal cost { get; set; }
        public string po_number { get; set; }

        [DataType(DataType.MultilineText)]
        public string description { get; set; }

        public int invoice_number { get; set; }

        [Required]
        public string serial_number { get; set; }

        [Required]
        public string asset_tag_number { get; set; }

        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        public DateTime? acquired_date { get; set; }

        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        public DateTime? disposed_date { get; set; }

        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        public DateTime? verified_date { get; set; }

        [Required]
        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        public DateTime created_date { get; set; }

        [Required]
        public string created_by { get; set; }

        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")]
        public DateTime? modified_date { get; set; }

        public string modified_by { get; set; }
    }
}

现在,在我的 Edit() 视图中,我尝试了以下操作来获得我所追求的:

尝试 1

我使用List 模板基于我的INV_AssetsHistory 模型创建了一个_AssetHistoryRecordsPartial 视图。这是目前在我的Shared Views 文件夹中使用默认代码设置的。

@model IEnumerable<InventoryTracker.Models.INV_AssetsHistory>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Location.location_dept)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Manufacturer.manufacturer_description)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Model.model_description)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Status.status_description)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Type.type_description)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Vendor.vendor_name)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.AssetId)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.ip_address)
        </th>

        ........

   </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Location.location_dept)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Manufacturer.manufacturer_description)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Model.model_description)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Status.status_description)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Type.type_description)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Vendor.vendor_name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.AssetId)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ip_address)
        </td>

        ................

    </tr>
}

</table>

Edit() 查看

`@Html.Partial("_AssetHistoryRecordsPartial", Model.Id)`

当我运行应用程序并加载 Edit() 视图时,我收到以下标记 @Html.Partial() 的上述代码行:

An exception of type 'System.InvalidOperationException' occurred in System.Web.Mvc.dll but was not handled in user code

Additional information: The model item passed into the dictionary is of type 'System.Int32', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1

据我所知,错误是说我的Partial 视图正在寻找模型的IEnumerable&lt;&gt; 列表,而我正在从我的父级传递我的主要 Model.Id (INV_Assets) Id查看?

尝试 2

由于我在 INV_Assets 模型 (public virtual ICollection&lt;INV_AssetsHistory&gt; AssetHistoryRecords { get; set; }) 上定义了一个 INV_AssetHistory 集合,我想也许我可以使用这个集合作为 GRIDMvc 中的模型定义:

        <div class="assetList">
        @try
        {
            @Html.Grid(Model.AssetHistoryRecords).Columns(columns =>
            {
                columns.Add(o => o.Status.status_description).Titled("Status").RenderValueAs(o => o.Status.status_description).Sanitized(false).Encoded(false).Sortable(true).Filterable(true).SetWidth(20);
                columns.Add(o => o.Location.location_dept).Titled("Dept").RenderValueAs(o => o.Location.location_dept).SetWidth(20);
                columns.Add(o => o.Location.location_room).Titled("Room").RenderValueAs(o => o.Location.location_room).SetWidth(20);
                columns.Add(o => o.owner).Titled("Owner").RenderValueAs(o => o.owner).SetWidth(20);
                columns.Add(o => o.Type.type_description).Titled("Type").RenderValueAs(o => o.Type.type_description).SetWidth(20);
                columns.Add(o => o.Manufacturer.manufacturer_description).Titled("Manufacturer").RenderValueAs(o => o.Manufacturer.manufacturer_description).SetWidth(20);
                columns.Add(o => o.Model.model_description).Titled("Model").RenderValueAs(o => o.Model.model_description).SetWidth(20);
                columns.Add(o => o.Vendor.vendor_name).Titled("Vendor").RenderValueAs(o => o.Vendor.vendor_name).SetWidth(20);
                columns.Add(o => o.description).Titled("Desc").RenderValueAs(o => o.description).SetWidth(20);
                columns.Add(o => o.asset_tag_number).Titled("Asset Tag #").RenderValueAs(o => o.asset_tag_number).SetWidth(20);
                columns.Add(o => o.serial_number).Titled("Serial #").RenderValueAs(o => o.serial_number).SetWidth(20);
                columns.Add(o => o.ip_address).Titled("IP Addr").RenderValueAs(o => o.ip_address).SetWidth(20);
                columns.Add(o => o.mac_address).Titled("Mac Addr").RenderValueAs(o => o.mac_address).SetWidth(20);
                columns.Add(o => o.po_number).Titled("PO #").RenderValueAs(o => o.po_number).SetWidth(20);
                columns.Add(o => o.invoice_number).Titled("Inv. #").RenderValueAs(o => Convert.ToString(o.invoice_number)).SetWidth(20);
                columns.Add(o => o.cost).Titled("Cost").RenderValueAs(o => "$" + Convert.ToString(o.cost)).SetWidth(20);
                columns.Add(o => o.note).Titled("Note").RenderValueAs(o => o.note).SetWidth(20);
                columns.Add(o => o.acquired_date).Titled("Acq. Date").RenderValueAs(o => Convert.ToString(o.acquired_date)).SetWidth(20);
                columns.Add(o => o.disposed_date).Titled("Disp. Date").RenderValueAs(o => Convert.ToString(o.disposed_date)).SetWidth(20);
                columns.Add(o => o.verified_date).Titled("Ver. Date").RenderValueAs(o => Convert.ToString(o.verified_date)).SetWidth(20);
                columns.Add(o => o.created_date).Titled("Crtd. Date").RenderValueAs(o => Convert.ToString(o.created_date)).SetWidth(20);
                columns.Add(o => o.created_by).Titled("By").RenderValueAs(o => o.created_by).SetWidth(20);
                columns.Add(o => o.modified_date).Titled("Mod. Date").RenderValueAs(o => Convert.ToString(o.modified_date)).SetWidth(20);
                columns.Add(o => o.modified_by).Titled("By").RenderValueAs(o => o.modified_by).SetWidth(20);
            }).WithPaging(10).Sortable().Filterable().WithMultipleFilters();
        }
        catch (NullReferenceException ex)
        {
            return;
        }
    </div>

然而,这只是用显示“没有要显示的项目”的数据来渲染我的列。我不明白这一点,因为我正在处理资产 1,并且我确保在 INV_AssetsHistory 中有一条与 INV_AssetsHistory.AssetId == 1 相关的记录。

可能做过类似事情的人可以权衡一下如何解决这个问题吗?


更新

使用 Murilo Amaru Gomes 的建议,我有以下几点:

INV_Assets - Edit() 视图

    @{
        Html.RenderAction("AssetHistoryGrid", "INV_Assets", new { id = Model.Id });
    }

INV_AssetsController

    public IQueryable<INV_AssetsHistory> GetHistoryByAssetId(int assetId)
    {
        var records = db.INV_AssetsHistory.Where(x => x.AssetId == assetId);
        return records;
    }

    public ActionResult AssetHistoryGrid(int id)
    {
        var list = GetHistoryByAssetId(id);
        return View("_AssetHistoryRecordsPartial", list);
    }

部分视图 - _AssetHistoryRecordsPartial

@model IEnumerable<InventoryTracker.Models.INV_AssetsHistory>
@using GridMvc.Html;
@using System.Collections.Generic;

<div class="assetList">
    @try
    {
        @Html.Grid(Model).Columns(columns =>
                {
                    columns.Add(o => o.Status.status_description).Titled("Status").RenderValueAs(o => o.Status.status_description).Sanitized(false).Encoded(false).Sortable(true).Filterable(true).SetWidth(20);
                    columns.Add(o => o.Location.location_dept).Titled("Dept").RenderValueAs(o => o.Location.location_dept).SetWidth(20);
                    columns.Add(o => o.Location.location_room).Titled("Room").RenderValueAs(o => o.Location.location_room).SetWidth(20);
                    columns.Add(o => o.owner).Titled("Owner").RenderValueAs(o => o.owner).SetWidth(20);
                    columns.Add(o => o.Type.type_description).Titled("Type").RenderValueAs(o => o.Type.type_description).SetWidth(20);
                    columns.Add(o => o.Manufacturer.manufacturer_description).Titled("Manufacturer").RenderValueAs(o => o.Manufacturer.manufacturer_description).SetWidth(20);
                    columns.Add(o => o.Model.model_description).Titled("Model").RenderValueAs(o => o.Model.model_description).SetWidth(20);
                    columns.Add(o => o.Vendor.vendor_name).Titled("Vendor").RenderValueAs(o => o.Vendor.vendor_name).SetWidth(20);
                    columns.Add(o => o.description).Titled("Desc").RenderValueAs(o => o.description).SetWidth(20);
                    columns.Add(o => o.asset_tag_number).Titled("Asset Tag #").RenderValueAs(o => o.asset_tag_number).SetWidth(20);
                    columns.Add(o => o.serial_number).Titled("Serial #").RenderValueAs(o => o.serial_number).SetWidth(20);
                    columns.Add(o => o.ip_address).Titled("IP Addr").RenderValueAs(o => o.ip_address).SetWidth(20);
                    columns.Add(o => o.mac_address).Titled("Mac Addr").RenderValueAs(o => o.mac_address).SetWidth(20);
                    columns.Add(o => o.po_number).Titled("PO #").RenderValueAs(o => o.po_number).SetWidth(20);
                    columns.Add(o => o.invoice_number).Titled("Inv. #").RenderValueAs(o => Convert.ToString(o.invoice_number)).SetWidth(20);
                    columns.Add(o => o.cost).Titled("Cost").RenderValueAs(o => "$" + Convert.ToString(o.cost)).SetWidth(20);
                    columns.Add(o => o.note).Titled("Note").RenderValueAs(o => o.note).SetWidth(20);
                    columns.Add(o => o.acquired_date).Titled("Acq. Date").RenderValueAs(o => Convert.ToString(o.acquired_date)).SetWidth(20);
                    columns.Add(o => o.disposed_date).Titled("Disp. Date").RenderValueAs(o => Convert.ToString(o.disposed_date)).SetWidth(20);
                    columns.Add(o => o.verified_date).Titled("Ver. Date").RenderValueAs(o => Convert.ToString(o.verified_date)).SetWidth(20);
                    columns.Add(o => o.created_date).Titled("Crtd. Date").RenderValueAs(o => Convert.ToString(o.created_date)).SetWidth(20);
                    columns.Add(o => o.created_by).Titled("By").RenderValueAs(o => o.created_by).SetWidth(20);
                    columns.Add(o => o.modified_date).Titled("Mod. Date").RenderValueAs(o => Convert.ToString(o.modified_date)).SetWidth(20);
                    columns.Add(o => o.modified_by).Titled("By").RenderValueAs(o => o.modified_by).SetWidth(20);
                }).WithPaging(10).Sortable().Filterable().WithMultipleFilters();
    }
    catch (NullReferenceException ex)
    {
        return;
    }
</div>

当我尝试打开 Edit() 视图时,我收到以下信息:

An exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll but was not handled in user code

Additional information: The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' must be called before the method 'Skip'.

此错误标记为 @helper RenderGridBody() 下的 if (!Model.ItemsToDisplay.Any()) _Grid.cshtml,它是 GRIDMvc 包的一部分:

@helper RenderGridBody()
{
    if (!Model.ItemsToDisplay.Any())
    {
    <tr class="grid-empty-text">
        <td colspan="@Model.Columns.Count()">
            @Model.EmptyGridText
        </td>
    </tr>
    }
    else
    {
        foreach (object item in Model.ItemsToDisplay)
        {
    <tr class="grid-row @Model.GetRowCssClasses(item)">
        @foreach (IGridColumn column in Model.Columns)
        {
            @column.CellRenderer.Render(column, column.GetCell(item))
        }
    </tr>
        }
    }
}

有人对此有想法吗?我以前在使用 GRIDMvc 时从未遇到过这样的错误。

【问题讨论】:

    标签: c# asp.net-mvc entity-framework razor asp.net-mvc-partialview


    【解决方案1】:

    您将 Model.Id 传递给 UserControl。你应该通过这些项目。模型中有它们吗?如果是这样你可以使用@Html.Partial("_AssetHistoryRecordsPartial", Model.Items),如果你不这样做,你可以使用@{ Html.RenderAction("Action", "Some", new { id = Model.Id }) ; },在你的控制器中你需要

    public class SomeController
    {
        public ActionResult Grid(int id)
        {
              var list = // Logic code to fill the items
              return View("_AssetHistoryRecordsPartial", list);
        }
     }
    

    【讨论】:

    • 感谢您的回复。请参阅我上面的编辑。
    • 更改查询方法以使用任何 OrderBy db.INV_AssetsHistory.Where(x => x.AssetId == assetId).OrderBy(x => x.AnyProperty)
    猜你喜欢
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2020-07-18
    • 1970-01-01
    • 2014-10-05
    相关资源
    最近更新 更多