【发布时间】:2021-01-09 01:41:26
【问题描述】:
我决定发布一个新问题,而不是添加到现有问题,因为这不是同一个问题。我按照对另一个问题的评论创建了一个 ViewModel。
到目前为止,我还没有必须从 ViewModel 中列出。我确实在网上搜索过,看看是否能找到一个例子,但我发现的只是;如何在 ViewModel 中创建列表,我已经知道该怎么做了。
我在下面有一个 ViewModel。我不确定它的结构是否正确,但控制器正在返回count = 0
控制器:
public ActionResult Index()
{
List<AccountingViewModels> list = new List<AccountingViewModels>();
return View(list);
}
视图有这个:@model IEnumerable<BestenEquipment.Models.AccountingViewModels>
我确实尝试过这样做@model List<BestenEquipment.Models.AccountingViewModels>
但出现错误 'List<AccountingViewModels>' does not contain a definition for 'Description' and no extension method 'Description' accepting a first argument of type 'List<AccountingViewModels>' could be found (are you missing a using directive or an assembly reference?)
控制器仍然是count = 0
IEnumerable 不会出错,它只是给了我一个空表。所以我认为 IEnumerable 是要走的路。我只需要修复控制器。
如果有人能指出我正确的方向或告诉我我的控制器有什么问题,那将有很大帮助。
这是视图模型:
public class AccountingViewModels
{
[Key]
public Guid TransactionId { get; set; }
public string Description { get; set; }
[Display(Name = "Company")]
public int? CompanyId { get; set; }
[Display(Name = "Vendor")]
public Guid? VendorId { get; set; }
[Display(Name = "Rec Chk #")]
public string InCheckNumber { get; set; }
[Display(Name = "Sent Chk #")]
public string OutCheckNumber { get; set; }
[Display(Name = "Invoice #")]
public string InvoiceNumber { get; set; }
[Display(Name = "PO #")]
public string PurchaseOrderNumber { get; set; }
[Display(Name = "Ledger Acct")]
public Guid LedgerAccountId { get; set; }
[Display(Name = "Credit")]
public decimal? DebitAmount { get; set; }
[Display(Name = "Debit")]
public decimal? CreditAmount { get; set; }
[Display(Name = "Transaction")]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = false)]
public DateTime TransactionDate { get; set; }
[Display(Name = "Modified By")]
public string ModifiedBy { get; set; }
[Display(Name = "Modified")]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = false)]
public DateTime? ModifiedDate { get; set; }
public string SavedDocument { get; set; }
[Display(Name = "Created")]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = false)]
public DateTime CreatedDate { get; set; }
[Display(Name = "Created By")]
public string CreatedBy { get; set; }
public bool IsCredit { get; set; }
public bool IsDebit { get; set; }
public Guid Type { get; set; }
[ForeignKey("LedgerAccountId")]
public LedgerAccount LedgerAccount { get; set; }
[ForeignKey("CompanyId")]
public CompanyNames Company { get; set; }
[ForeignKey("VendorId")]
public Vendors Vendor { get; set; }
}
这很可能是一个简单的修复,我只需要轻推一下..
使用db模型是这样的:return View(db.Transaction.ToList());
我需要做同样的事情,但要使用 ViewModel..
感谢您的帮助!
谢谢
更新:
这是我的原始问题的链接,并被告知要创建一个 viewModel.. Original Issue
更新:
添加视图:
@model List<BestenEquipment.Models.AccountingViewModels>
@{
Layout = "~/Views/Shared/_DashboardLayout.cshtml";
}
@section ScriptsOrCss
{
@Html.Action("DataTableCssJs", "Layout")
}
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<section class="content-header">
<h1>
Overview List
<small> Transactions </small>
</h1>
</section>
<section class="content">
<!-- Small boxes (Stat box) -->
<div class="row">
<div class="col-md-12">
@if (ViewBag.Create == true)
{
<div class="box box-solid box-primary">
<div class="box-body">
<!-- Split button -->
<div class="margin">
<div class="btn-group">
@Ajax.ModalDialogActionLink("Create Quick", "Create", "Create ", "btn btn-info btn-sm")
</div>
<div class="btn-group">
<a href="~/Tranaction/Create" class="btn btn-warning btn-sm">Create Full</a>
</div>
</div>
<!-- flat split buttons -->
</div><!-- /.box-body -->
</div>
}
<div class="box box-primary">
<div class="box-header">
<h3 class="box-title">Orders</h3>
</div><!-- /.box-header -->
<div class="box-body table-responsive">
<table class="table table-striped table-hover table-bordered" id="TransactionListTable">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Description)
</th>
<th>
@Html.DisplayNameFor(model => model.Company.CompanyName)
</th>
<th>
@Html.DisplayNameFor(model => model.Vendor.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.InCheckNumber)
</th>
<th>
@Html.DisplayNameFor(model => model.OutCheckNumber)
</th>
<th>
@Html.DisplayNameFor(model => model.InvoiceNumber)
</th>
<th>
@Html.DisplayNameFor(model => model.PurchaseOrderNumber)
</th>
<th>
@Html.DisplayNameFor(model => model.LedgerAccountId)
</th>
<th>
@Html.DisplayNameFor(model => model.DebitAmount)
</th>
<th>
@Html.DisplayNameFor(model => model.CreditAmount)
</th>
<th>
@Html.DisplayNameFor(model => model.TransactionDate)
</th>
<th>
CRUD
</th>
<th>
Actions
</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.Items)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Description)
</td>
<td>
@if (item.CompanyId != null)
{
@Html.DisplayFor(modelItem => item.Company.CompanyName)
}
else
{
<b>N/A</b>
}
</td>
<td>
@if (item.VendorId != null)
{
@Html.DisplayFor(modelItem => item.Vendor.Name)
}
else
{
<b>N/A</b>
}
</td>
<td>
@if (item.InCheckNumber != null)
{
@Html.DisplayFor(modelItem => item.InCheckNumber)
}
else
{
<b>N/A</b>
}
</td>
<td>
@if (item.OutCheckNumber != null)
{
@Html.DisplayFor(modelItem => item.OutCheckNumber)
}
else
{
<b>N/A</b>
}
</td>
<td>
@if (item.InvoiceNumber != null)
{
@Html.DisplayFor(modelItem => item.InvoiceNumber)
}
else
{
<b>N/A</b>
}
</td>
<td>
@if (item.PurchaseOrderNumber != null)
{
@Html.DisplayFor(modelItem => item.PurchaseOrderNumber)
}
else
{
<b>N/A</b>
}
</td>
<td>
@Html.DisplayFor(modelItem => item.LedgerAccount.Title)
</td>
<td>
@if (item.IsDebit == true)
{
@Html.DisplayFor(modelItem => item.DebitAmount)
}
else
{
<b>N/A</b>
}
</td>
<td>
@if (item.IsCredit == true)
{
@Html.DisplayFor(modelItem => item.CreditAmount)
}
else
{
<b>N/A</b>
}
</td>
<td>
@Html.DisplayFor(modelItem => item.TransactionDate)
</td>
<td>
@if (ViewBag.Edit == true)
{
@Ajax.ModalDialogActionLink("Edit", "Edit", "Edit", "btn btn-warning btn-sm", new { id = item.TransactionId })
}
@if (ViewBag.Read == true)
{
@Ajax.ModalDialogActionLink("Details", "Details", "Transaction Details", "btn btn-info btn-sm", new { id = item.TransactionId })
}
@if (ViewBag.Delete == true)
{
@Ajax.ActionLink("Delete", "Delete", "Tranaction", new { id = item.TransactionId },
new AjaxOptions()
{
HttpMethod = "Delete",
Confirm = "Are you sure you want to delete " + item.Description + "Transaction",
}, new { @class = "btn btn-danger btn-sm Delete" })
}
</td>
<td>
</td>
</tr>
}
</tbody>
</table>
</div>
</div>
</div>
</div>
【问题讨论】:
-
您尚未分享您的视图,但您的视图中似乎在说
Model.Description,而您应该说foreach (var item in Model) { item.Description }。 -
@Noah 我可以添加我的视图,但是控制器没有填充任何内容,这是我的视图`@Html.DisplayFor(modelItem => item.Description)`
-
我认为模型不能是 IEnumerable 或 List。它必须是一个普通的对象。您可以创建模型类并将这个 Ienumerable 作为属性放入模型中。
-
@Sreenath 我想我以前做过,但不是我需要的。我最初遇到的问题是显示一个列表,其中包含另一个数据库中另一个表中的几列。但是,我被告知要创建一个 viewModel。列显示为空。原始问题已添加到上述问题中。
-
您编写的谓词看起来不太正确,因为您的一侧有
modelItem,另一侧有item。无论如何,由于您的模型是AccountingViewModelss 的集合,因此您确实在尝试引用不存在的collection 的Description属性。它是集合中每个项目 的属性。这就是那个错误的原因。这与控制器或集合的空虚无关。
标签: c# asp.net-mvc