Linq Запрос ViewModel не DomainModel - PullRequest
0 голосов
/ 05 апреля 2019

Просматривая Google, чтобы найти примеры использования установки MVC Crud, я всегда нахожу, что страница с подробностями пропускается как важная, особенно если вы хотите использовать модель представления.

Проблема, с которой я столкнулся, заключается в том, что типичная установка приложения MVC из Visual Studio будет использовать CRUD, но на всех страницах представления будет использоваться модель домена, а не модель представления.

Итак, я хочу получить данные из двух моделей на основе целого числа легко, если это одна модель:


        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Asset Assets = db.Assets.Find(id);

            if (id == null)
            {
                return HttpNotFound();
            }
            return View();
        }

Но тогда как мне взять два комплекта? Вот мой запрос linq о модели представления:


var ASSPATVM = (from s in db.Assets
                        join cp in db.PATs on s.AssetID equals cp.AssetID into AP
                        from subpat in AP.DefaultIfEmpty()


                        select new ASSPATVM
                        {
                            AssetID = s.AssetID,
                            ProductName = s.ProductName,
                            ModelName = s.ModelName,
                            SupplierName = s.SupplierName,
                            ManufacturerName = s.ManufacturerName,
                            SerialNo = s.SerialNo,
                            PurchaseDate = s.PurchaseDate,
                            PoNo = s.PoNo,
                            Costing = s.Costing,
                            TeamName = s.TeamName,
                            StaffName = s.StaffName,
                            InspectionDocumnets = subpat.InspectionDocumnets ?? String.Empty,
                            InspectionOutcomeResult = subpat.InspectionOutcomeResult
                        });

EDIT

Итак, я попробовал:

 public ActionResult Details(int? AssetID)
        {
            var ASSPATINCVM = (from s in db.Assets
                                  join cp in db.PATs on s.AssetID equals cp.AssetID into AP
                                  from subASSPAT in AP.DefaultIfEmpty()
                                        join ci in db.INSs on s.AssetID equals ci.AssetID into AI
                                        from subASSINC in AI.DefaultIfEmpty()


                                        select new ASSPATINCVM()
                                  {
                                      AssetID = s.AssetID,
                                      ProductName = s.ProductName,
                                      ModelName = s.ModelName,
                                      SupplierName = s.SupplierName,
                                      ManufacturerName = s.ManufacturerName,
                                      SerialNo = s.SerialNo,
                                      PurchaseDate = s.PurchaseDate,
                                      PoNo = s.PoNo,
                                      Costing = s.Costing,
                                      TeamName = s.TeamName,
                                      StaffName = s.StaffName,
                                      WarrantyEndDate = subASSPAT.WarrantyEndDate,
                                      InspectionDate = subASSPAT.InspectionDate,
                                      InspectionOutcomeResult = subASSPAT.InspectionOutcomeResult,
                                      InspectionDocumnets = subASSPAT.InspectionDocumnets ?? String.Empty,
                                      InspectionDueDate = subASSPAT.InspectionDueDate
                                        });

            return View(ASSPATINCVM);
        }

Я получаю ошибку:

The model item passed into the dictionary is of type 'System.Data.Entity.Infrastructure.DbQuery`1[Assets.Areas.CCS.Models.ASSPATINCVM]', but this dictionary requires a model item of type 'Assets.Areas.CCS.Models.ASSPATINCVM'.

Итак, я попытался перечислить ()

InspectionDate = subASSPAT.InspectionDate,
                                      InspectionOutcomeResult = subASSPAT.InspectionOutcomeResult,
                                      InspectionDocumnets = subASSPAT.InspectionDocumnets ?? String.Empty,
                                      InspectionDueDate = subASSPAT.InspectionDueDate
                                        }).List();

@model List<Assets.Areas.CCS.Models.ASSPATINCVM>

Но теперь жалоба

List<ASSPATINCVM>' does not contain a definition for 'ModelName'

Обновление

ViewModel:

using Assets.Models;
using System;
using System.ComponentModel.DataAnnotations;

namespace Assets.Areas.CCS.Models
{
    public class ASSPATINCVM
    {


        public int AssetID { get; set; }
        public string SerialNo { get; set; }
        public string PoNo { get; set; }
        public float? Costing { get; set; }
        public string InspectionDocumnets { get; set; }

        public Product ProductName { get; set; }
        public InspectionOutcome InspectionOutcomeResult { get; set; }
        public Model ModelName { get; set; }
        public BudgetCode Code { get; set; }
        public AssetType AssetTypeName { get; set; }
        public Manufacturer ManufacturerName { get; set; }
        public Staff StaffName { get; set; }
        public Team TeamName { get; set; }
        public Supplier SupplierName { get; set; }

        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:dd/MM/yy}", ApplyFormatInEditMode = true)]
        public DateTime? PurchaseDate { get; set; }
        public DateTime? WarrantyEndDate { get; set; }
        public DateTime? InspectionDate { get; set; }
        public DateTime? InspectionDueDate { get; internal set; }
    }
}

Часть страницы сведений:

@model Assets.Areas.CCS.Models.ASSPATINCVM

@{
    ViewBag.Title = "Details";
}

<h2>Details</h2>

<div>
    <h4>ClinicalAsset</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.ModelName)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.ModelName)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.AssetTypeName)
        </dt>

        <dd>

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Действие вашего контроллера возвращает IEnumerable<ASSPATINCVM>, но ваше представление ожидает один экземпляр ClinicalASSPATINCVM, посмотрите эту строку в вашем представлении:

@model Assets.Areas.Clinical.Models.ClinicalASSPATINCVM

Вы сможете обновить свой вид до соответствующего IEnumerable типа для класса вашей модели ASSPATINCVM, а затем выполнить итерацию по списку, как показано ниже:

@model IEnumerable<Assets.Areas.CCS.Models.ASSPATINCVM>

@{
    ViewBag.Title = "Details";
}

<h2>Details</h2>

<div>
    <h4>ClinicalAsset</h4>
    <hr />
    <dl class="dl-horizontal">
    @foreach(var m in Model)
    {
        <dt>
            @Html.DisplayNameFor(model => model[0].ModelName)
        </dt>
        <dd>
            @m.ModelName
        </dd>
    }
    </dl>
</div>

EDIT:

Основываясь на комментариях, вам нужно обновить запрос, чтобы он возвращал один экземпляр ASSPATINCVM, который вы можете сделать следующим образом:

    public ActionResult Details(int? AssetID)
    {
        var ASSPATINCVM = (from s in db.Assets
                              join cp in db.PATs on s.AssetID equals cp.AssetID into AP
                              from subASSPAT in AP.DefaultIfEmpty()
                                    join ci in db.INSs on s.AssetID equals ci.AssetID into AI
                                    from subASSINC in AI.DefaultIfEmpty()


                                    select new ASSPATINCVM()
                              {
                                  AssetID = s.AssetID,
                                  ProductName = s.ProductName,
                                  ModelName = s.ModelName,
                                  SupplierName = s.SupplierName,
                                  ManufacturerName = s.ManufacturerName,
                                  SerialNo = s.SerialNo,
                                  PurchaseDate = s.PurchaseDate,
                                  PoNo = s.PoNo,
                                  Costing = s.Costing,
                                  TeamName = s.TeamName,
                                  StaffName = s.StaffName,
                                  WarrantyEndDate = subASSPAT.WarrantyEndDate,
                                  InspectionDate = subASSPAT.InspectionDate,
                                  InspectionOutcomeResult = subASSPAT.InspectionOutcomeResult,
                                  InspectionDocumnets = subASSPAT.InspectionDocumnets ?? String.Empty,
                                  InspectionDueDate = subASSPAT.InspectionDueDate
                                    }).FirstOrDefault();

        return View(ASSPATINCVM);
    }
0 голосов
/ 08 апреля 2019

На основании ответа jcruz:

Мне также нужно было добавить ссылку между идентификатором и AssetID следующим образом:

var ASSPATINCVM = (from s in db.Assets
                                       join cp in db.PATs on s.AssetID equals cp.AssetID into AP
                                       from subASSPAT in AP.DefaultIfEmpty()
                                       join ci in db.INSs on s.AssetID equals ci.AssetID into AI
                                       from subASSINC in AI.DefaultIfEmpty()


                                       select new ASSPATINCVM
                                       {
                                           AssetID = s.AssetID,
                                           AssetTypeName = s.AssetTypeName,
                                           ProductName = s.ProductName,
                                           ModelName = s.ModelName,
                                           SupplierName = s.SupplierName,
                                           ManufacturerName = s.ManufacturerName,
                                           SerialNo = s.SerialNo,
                                           PurchaseDate = s.PurchaseDate,
                                           PoNo = s.PoNo,
                                           Costing = s.Costing,
                                           TeamName = s.TeamName,
                                           StaffName = s.StaffName,
                                           WarrantyEndDate = subASSPAT.WarrantyEndDate,
                                           InspectionDate = subASSPAT.InspectionDate,
                                           InspectionOutcomeResult = subASSPAT.InspectionOutcomeResult,
                                           InspectionDocumnets = subASSPAT.InspectionDocumnets ?? String.Empty,
                                           InspectionDueDate = subASSPAT.InspectionDueDate
                                       }).FirstOrDefault(x => x.AssetID == id);



...