Tampilkan semua catatan riwayat untuk Model.Id tertentu di Tampilan Edit()?

Dalam program Pelacakan Inventaris saya, saya mencoba menampilkan semua Catatan Riwayat untuk suatu Aset setiap kali seseorang membuka Tampilan Edit(). Aplikasi saya memiliki 2 model yang relevan INV_Assets dan INV_AssetsHistory:

INV_Aset:

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

Nah, pada Tampilan Edit() saya, saya telah mencoba yang berikut untuk mendapatkan apa yang saya cari:

Percobaan 1:

Saya membuat tampilan _AssetHistoryRecordsPartial berdasarkan model INV_AssetsHistory saya menggunakan template List. Ini saat ini diatur dengan kode default di folder Shared Views saya.

@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() Tampilan:

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

Ketika saya menjalankan aplikasi dan memuat tampilan Edit() saya menerima tanda berikut pada baris kode di atas untuk @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

Sejauh yang saya tahu, kesalahannya mengatakan bahwa Tampilan Partial saya sedang mencari daftar IEnumerable<> untuk Model, sedangkan saya meneruskan Id Model.Id (INV_Assets) utama saya dari Tampilan Induk saya?

Upaya 2:

Karena saya memiliki Koleksi INV_AssetHistory yang ditentukan pada INV_Assets Model (public virtual ICollection<INV_AssetsHistory> AssetHistoryRecords { get; set; }) saya, saya pikir mungkin saya bisa menggunakan koleksi ini sebagai definisi Model dalam 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>

Namun ini tidak melakukan apa pun selain merender kolom saya dengan data yang menunjukkan "Tidak ada item untuk ditampilkan". Ini saya tidak mengerti karena saya sedang berurusan dengan Aset 1 dan saya telah memastikan ada catatan di INV_AssetsHistory yang berkaitan dengan INV_AssetsHistory.AssetId == 1.

Dapatkah seseorang yang mungkin pernah melakukan hal serupa mempertimbangkan cara melakukan hal ini?


Pembaruan:

Menggunakan saran Murilo Amaru Gomes saya punya yang berikut:

INV_Assets - Tampilan 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);
    }

Tampilan Sebagian - _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>

Ketika saya mencoba membuka tampilan Edit(), saya menerima yang berikut:

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'.

Kesalahan ini ditandai untuk if (!Model.ItemsToDisplay.Any()) di bawah @helper RenderGridBody() dalam _Grid.cshtml yang merupakan bagian dari paket 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>
        }
    }
}

Adakah yang punya pemikiran tentang ini? Saya belum pernah mengalami error seperti ini sebelumnya saat menggunakan GRIDMvc.


person Analytic Lunatic    schedule 23.03.2015    source sumber


Jawaban (1)


Anda meneruskan Model.Id ke UserControl. Anda harus melewati itemnya. Apakah Anda memilikinya dalam model? Jika demikian, Anda dapat melakukan @Html.Partial("_AssetHistoryRecordsPartial", Model.Items), jika tidak, Anda dapat menggunakan @{ Html.RenderAction("Action", "Some", new { id = Model.Id }) ; }, dan di pengontrol yang Anda perlukan

public class SomeController
{
    public ActionResult Grid(int id)
    {
          var list = // Logic code to fill the items
          return View("_AssetHistoryRecordsPartial", list);
    }
 }
person Murilo Amaru Gomes    schedule 23.03.2015
comment
Terima kasih telah merespons. Silakan lihat EDIT saya di atas. - person Analytic Lunatic; 23.03.2015
comment
Ubah metode kueri Anda untuk menggunakan OrderBy db.INV_AssetsHistory.Where(x =› x.AssetId == assetId).OrderBy(x =› x.AnyProperty) - person Murilo Amaru Gomes; 23.03.2015