【问题标题】:Passing data from viewmodel to view issue ASP.NET MVC从视图模型传递数据以查看问题 ASP.NET MVC
【发布时间】:2021-12-03 09:39:36
【问题描述】:

在我的应用程序中,为了创建报告视图,我创建了一个 ViewModel:

namespace Asp_PASMVC.ViewModels
{
    [NotMapped]
    public class ReportViewModel
    {
        public string RequestBy { get; set; } // AppRequest
        public string RequestByDessignation { get; set; } // AppRequest
        public string RequestByDepartment { get; set; }// AppRequest
        public string RequestedDate { get; set; }// AppRequest
        public string ApprovalId { get; set; }// AppRequest      
        public string CompanyName { get; set; }
        public List<ApprovalList> ApprovalList { get; set; }
        public List<GeneralItemsApprovedList> GeneralItemsApprovedList { get; set; }
    }

    [NotMapped]
    public class ApprovalList
    {
        public string ApproveDate { get; set; }
        public string ApprovedBy { get; set; }
        public string ApprovedByDessignation { get; set; }
    }

    [NotMapped]
    public class GeneralItemsApprovedList
    {
        public string ItemDescription { get; set; }
        public string ItemPrice { get; set; }
        public byte[] Attachment { get; set; }       
    }
}

然后在控制器中,我加入了我想要获取数据的每个表,并将该数据传递给报表视图模型。

public ActionResult Index(int id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    AppRequest appRequest = db.AppRequest.Find(id);

    if (appRequest.General.Count != 0)
    {
        List<ReportViewModel> RequestView = new List<ReportViewModel>();


        var ReqDetails = (from a in db.AppRequest
                          join e in db.CreateEmployee on a.Req_By equals e.Id
                          join c in db.CreateCompany on e.CompanyId equals c.Id
                          join d in db.CreateDesignation on e.DesignId equals d.Id
                          join dep in db.CreateDepartment on e.DepId equals dep.Id
                          where a.Id == id
                          select new ReportViewModel
                          {
                              RequestedDate = a.Req_Date.ToString(),
                              RequestBy = e.EmpName,
                              CompanyName = c.CompanyName,
                              RequestByDessignation = d.Designation,
                              RequestByDepartment = dep.Department,
                              GeneralItemsApprovedList= (from a in db.AppRequest
                                                         join g in db.General on a.Id equals g.Req_Id
                                                         join gi in db.GeneralItms on g.Id equals gi.General_Id
                                                         where a.Id == id
                                                         select new GeneralItemsApprovedList
                                                         {
                                                             Attachment = gi.Attachment,
                                                             ItemDescription = gi.Attachment_Description,
                                                             ItemPrice = gi.Attachment_Amount.ToString()


                                                         }).ToList(),

                              ApprovalList = (from a in db.AppRequest
                                              join ap in db.ApprovalProcess on a.Id equals ap.Req_Id
                                              join pa in db.ApproveParties on ap.Id equals pa.ApprovalProcess_Id
                                              join ae in db.CreateEmployee on pa.Approver_Id equals ae.Id
                                              join ad in db.CreateDesignation on ae.DesignId equals ad.Id
                                              where a.Id == id
                                              select new ApprovalList
                                              {
                                                  ApproveDate = pa.Approved_Date.ToString(),
                                                  ApprovedBy = ae.EmpName,
                                                  ApprovedByDessignation = ad.Designation,

                                                 

                                              }).ToList()
                                              
                          }).ToList();

        return View("ApprovedReport", ReqDetails);

    }

    return View("");
}

因此,当我为视图调用视图模型数据时,就会出现问题。它没有向我显示我想要调用的属性。请注意,我仍在学习 asp.MVC,同时我开始为我的教育目的开发这个应用程序。所以有些地方我还不清楚。所以不知道我在这里做错了什么。所以这是我传递 ViewModel 数据的视图

@model  IEnumerable <Asp_PASMVC.ViewModels.ReportViewModel>

@{

    Layout = "~/Views/Shared/_Layout.cshtml";
}

<br />
<div class="invoice p-3 mb-3">
    <!-- title row -->
    <div class="row">
        <div class="col-12">
            <h4>
                <i class="fas fa-globe"></i> PAS Approval
                <small class="float-right">@DateTime.Now</small>
            </h4>
        </div>
        <div class="col-12">
            <h4>
            </h4>
        </div>
        <!-- /.col -->
    </div>
    <!-- info row -->
    <div class="row invoice-info">
        <div class="col-sm-4 invoice-col">

            From
            <address>
                <strong> @Html.DisplayFor(model => model.RequestBy)</strong><br> @Html.DisplayFor(model => model.RequestByDessignation)<br> @Html.DisplayFor(model => model.RequestByDepartment)<br> @Html.DisplayFor(model => model.CompanyName)<br><br>@Html.DisplayFor(model => model.RequestedDate)<br>
            </address>
        </div>
        <!-- /.col -->
        <div class="col-sm-4 invoice-col">
            Approved By
            @foreach (var item in Model.ApprovalList)
            {
                <address>
                    <strong>@Html.DisplayFor(model => item.ApprovedBy)</strong><br>@Html.DisplayFor(model => item.ApprovedByDessignation)<br>@Html.DisplayFor(model => item.ApproveDate)<br>@*Approved Date*@<br>
                </address>
            }

错误提示:

传入字典的模型项是类型 'System.Collections.Generic.List`1[Asp_PASMVC.ViewModels.ReportViewModel]', 但是这本字典需要一个类型的模型项 'Asp_PASMVC.ViewModels.ReportViewModel'。

@Html.DisplayFor(model =&gt; model.RequestBy) 行中也显示RequestBy 找不到。

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    你的模型是一个集合:

    @model IEnumerable<Asp_PASMVC.ViewModels.ReportViewModel>
    

    因此,要访问集合中的任何项目,都需要对其进行迭代。

    你可以像下面这样执行它:

    <div class="col-sm-4 invoice-col">
        From
    @foreach (var model in Model)
    {
        <address>
            <strong> @Html.DisplayFor(m => model.RequestBy)</strong><br> @Html.DisplayFor(m => model.RequestByDessignation)<br> @Html.DisplayFor(m => model.RequestByDepartment)<br> @Html.DisplayFor(m => model.CompanyName)<br><br>@Html.DisplayFor(m => model.RequestedDate)<br>
        </address>
    }
    </div>
    

    编辑:

    此版本使用嵌套循环来显示每个模型项的ApprovalList 列表:

    <div class="col-sm-4 invoice-col">
        From
    @foreach (var model in Model)
    {
        <address>
            <strong> @Html.DisplayFor(m => model.RequestBy)</strong><br> @Html.DisplayFor(m => model.RequestByDessignation)<br> @Html.DisplayFor(m => model.RequestByDepartment)<br> @Html.DisplayFor(m => model.CompanyName)<br><br>@Html.DisplayFor(m => model.RequestedDate)<br>
        </address>
    
    </div>
    
    <div class="col-sm-4 invoice-col">
                Approved By
        @foreach (var item in model.ApprovalList)
        {
            <address>
                <strong>@Html.DisplayFor(m => item.ApprovedBy)</strong><br>@Html.DisplayFor(m => item.ApprovedByDessignation)<br>@Html.DisplayFor(m => item.ApproveDate)<br>@*Approved Date*@<br>
            </address>
        }
    </div>
    }
    

    【讨论】:

    • @smcdevelpments:你为什么使用First()?尝试在 EDIT: 之后使用更新后的代码。我想这就是你的意思。
    • 顺便说一下(id == null) 总是会返回falseint 参数不能是 null。也许您想使用可空类型:int?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 2014-06-11
    • 2016-01-01
    • 2012-03-28
    • 2011-11-08
    • 1970-01-01
    • 2012-02-02
    相关资源
    最近更新 更多