我正在嘗試使用以下方法將 select new {} 傳遞給視圖:
var results =
(from n in _context.Nodes
join o in _context.Organizations on n.OrgId equals o.Id
join t in _context.Organizations on n.ContractingOrgId equals t.Id
select new
{
Id = n.Id,
Name = n.Name,
assigned_org = o.ShortName,
con_org_short_name = t.ShortName,
expiry = n.ExpireDate,
lastActive = n.ActiveDate
});
if (!String.IsNullOrEmpty(searchString))
{
results = results.Where(s => s.con_org_short_name.Contains(searchString)
|| s.Id.ToString().StartsWith(searchString));
}
switch (sortOrder)
{
case "Client_desc":
results = results.OrderByDescending(s => s.con_org_short_name);
break;
case "Client":
results = results.OrderBy(s => s.con_org_short_name);
break;
case "Assigned":
results = results.OrderBy(s => s.assigned_org);
break;
case "Assigned_desc":
results = results.OrderByDescending(s => s.assigned_org);
break;
case "Expires":
results = results.OrderBy(s => s.expiry);
break;
case "Expires_desc":
results = results.OrderByDescending(s => s.expiry);
break;
case "LastActive":
results = results.OrderBy(s => s.lastActive);
break;
case "LastActive_desc":
results = results.OrderByDescending(s => s.lastActive);
break;
case "Id_desc":
results = results.OrderByDescending(s => s.Id);
break;
default:
results = results.OrderBy(s => s.Id);
break;
};
int pageSize = 12;
int pageNumber = (page ?? 1);
return View(await results.ToPagedListAsync(pageNumber, pageSize));
這會在回傳 View() 處引發錯誤
"InvalidOperationException: 傳入 ViewDataDictionary 的模型項的型別為'X.PagedList.StaticPagedList
1[<>f__AnonymousType26[System.Int32,System.String,System.String,System.String,System.Nullable1[System.DateTime],System.Nullable1[System.DateTime]]]',但是這個 ViewDataDictionary 實體需要一個“X.PagedList.IPagedList`1[AdminPortal.Models.Node]”型別的模型項。
我在這些行上得到一個構建錯誤:
if (!String.IsNullOrEmpty(searchString))
{
results = results.Where(s => s.con_org_short_name.Contains(searchString)
|| s.Id.ToString().StartsWith(searchString));
}
在“結果”上的可列舉可視化工具中,該物件在第一列中顯示為匿名型別,它看起來像一個陣列,但它具有預期的輸出。
問題是,如何僅訪問該物件并將其傳遞給正確型別的回傳 View()?
這是結果應該傳遞到的視圖:
@model X.PagedList.IPagedList<AdminPortal.Models.Node>
@using X.PagedList;
@using X.PagedList.Mvc.Core;
<link href="~/css/PagedList.css" rel="stylesheet" type="text/css" />
@{
ViewData["Title"] = "Index";
}
<div class="row pt-4">
<div class=" col-12 text-center">
<h2 class="text-white">Node List</h2>
</div>
</div>
<div class="container">
<div class=" row pt-4" style="padding-bottom:10px">
<div class=" col-6">
@using (Html.BeginForm("Index", "Nodes", FormMethod.Get))
{
<p>
Find by name/id: @Html.TextBox("SearchString",ViewBag.CurrentFilter as string, htmlAttributes: new {style="background-color:#cef2eb"})
<input type="submit" value="Search" class=" btn btn-info" />
</p>
}
</div>
<div class=" col-6 text-end">
<a asp-controller="Nodes" asp-action="Create" class=" btn btn-primary">
<i class="fa-solid fa-circle-plus"></i> Create Node
</a>
</div>
</div>
<table class="table table-striped table-bordered dt-responsive nowrap" width="100%" cellspacing="0">
<thead>
<tr style="color:#126E75; background-color:lightcyan">
<th class=col-sm-1 style="text-align:left">
@Html.ActionLink("ID", "Index", new { sortOrder = ViewBag.IDSortParm, currentFilter=ViewBag.CurrentFilter })
</th>
<th class=col-sm-2 style ="text-align:left">
Node Name
</th>
<th class=col-sm-1 style="text-align:left">
Mode
</th>
<th class=col-sm-2 style ="text-align:left">
@Html.ActionLink("Assigned To", "Index", new { sortOrder = ViewBag.AssignedSortParm, currentFilter=ViewBag.CurrentFilter })
</th>
<th class=col-sm-2 style ="text-align:left">
@Html.ActionLink("Contracting Org", "Index", new { sortOrder = ViewBag.ClientSortParm, currentFilter=ViewBag.CurrentFilter })
</th>
<th class=col-sm-1 style ="text-align:left">
@Html.ActionLink("Expires", "Index", new { sortOrder = ViewBag.ExpiresSortParm, currentFilter=ViewBag.CurrentFilter })
</th>
<th class=col-sm-1 style ="text-align:left">
@Html.ActionLink("LastActive", "Index", new { sortOrder = ViewBag.LastActiveSortParm, currentFilter=ViewBag.CurrentFilter })
</th>
<th scope="col" colspan="2" style=" width:10%; text-align:center">
Action
</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model) {
<tr class="table-light">
<td align="left">
@Html.DisplayFor(modelItem => item.Id)
</td>
<td align="left">
@Html.DisplayFor(modelItem => item.Name)
</td>
<td align="left">
@Html.DisplayFor(modelItem => item.IsStudy)
</td>
<td align="left">
@Html.DisplayFor(modelItem => item.Org.ShortName)
</td>
<td align ="left">
@Html.DisplayFor(modelItem => item.ContractingOrg.ShortName)
</td>
<td align="left">
@Html.DisplayFor(modelItem => item.ExpireDate)
</td>
<td align="left">
@Html.DisplayFor(modelItem => item.ActiveDate)
</td>
<td style="text-align: center">
<a asp-action="Edit" asp-route-id="@item.Id">
<i class="fas fa-edit"></i>
</a>
</td>
<td style="text-align: center">
<a asp-action="Details" asp-route-id="@item.Id">
<i class="fa-solid fa-eye" style="color:blue"></i>
</a>
</td>
</tr>
}
</tbody>
</table>
</div>
<div class=" col-12 text-end">
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount @Html.PagedListPager(Model, page => Url.Action("Index", new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }))
</div>
uj5u.com熱心網友回復:
您的問題有一種解決方案。
查看模型
NodeViewModel.CS
public class NodeViewModel
{
public int Id {get;set;}
public string Name {get;set;}
public string assigned_org {get;set;}
public string con_org_short_name {get;set;}
public string expiry {get;set;}
public string lastActive {get;set;}
}
控制器方法:
var results =
(from n in _context.Nodes
join o in _context.Organizations on n.OrgId equals o.Id
join t in _context.Organizations on n.ContractingOrgId equals t.Id
select new NodeViewModel
{
Id = n.Id,
Name = n.Name,
assigned_org = o.ShortName,
con_org_short_name = t.ShortName,
expiry = n.ExpireDate,
lastActive = n.ActiveDate
});
if (!String.IsNullOrEmpty(searchString))
{
results = results.Where(s => s.con_org_short_name.Contains(searchString)
|| s.Id.ToString().StartsWith(searchString));
}
switch (sortOrder)
{
case "Client_desc":
results = results.OrderByDescending(s => s.con_org_short_name);
break;
case "Client":
results = results.OrderBy(s => s.con_org_short_name);
break;
case "Assigned":
results = results.OrderBy(s => s.assigned_org);
break;
case "Assigned_desc":
results = results.OrderByDescending(s => s.assigned_org);
break;
case "Expires":
results = results.OrderBy(s => s.expiry);
break;
case "Expires_desc":
results = results.OrderByDescending(s => s.expiry);
break;
case "LastActive":
results = results.OrderBy(s => s.lastActive);
break;
case "LastActive_desc":
results = results.OrderByDescending(s => s.lastActive);
break;
case "Id_desc":
results = results.OrderByDescending(s => s.Id);
break;
default:
results = results.OrderBy(s => s.Id);
break;
};
int pageSize = 12;
int pageNumber = (page ?? 1);
return View(await results.ToPagedListAsync(pageNumber, pageSize));
看法
@model X.PagedList.IPagedList<NodeViewModel>
@using X.PagedList;
@using X.PagedList.Mvc.Core;
<link href="~/css/PagedList.css" rel="stylesheet" type="text/css" />
@{
ViewData["Title"] = "Index";
}
<div class="row pt-4">
<div class=" col-12 text-center">
<h2 class="text-white">Node List</h2>
</div>
</div>
<div class="container">
<div class=" row pt-4" style="padding-bottom:10px">
<div class=" col-6">
@using (Html.BeginForm("Index", "Nodes", FormMethod.Get))
{
<p>
Find by name/id: @Html.TextBox("SearchString",ViewBag.CurrentFilter as string, htmlAttributes: new {style="background-color:#cef2eb"})
<input type="submit" value="Search" class=" btn btn-info" />
</p>
}
</div>
<div class=" col-6 text-end">
<a asp-controller="Nodes" asp-action="Create" class=" btn btn-primary">
<i class="fa-solid fa-circle-plus"></i> Create Node
</a>
</div>
</div>
<table class="table table-striped table-bordered dt-responsive nowrap" width="100%" cellspacing="0">
<thead>
<tr style="color:#126E75; background-color:lightcyan">
<th class=col-sm-1 style="text-align:left">
@Html.ActionLink("ID", "Index", new { sortOrder = ViewBag.IDSortParm, currentFilter=ViewBag.CurrentFilter })
</th>
<th class=col-sm-2 style ="text-align:left">
Node Name
</th>
<th class=col-sm-1 style="text-align:left">
Mode
</th>
<th class=col-sm-2 style ="text-align:left">
@Html.ActionLink("Assigned To", "Index", new { sortOrder = ViewBag.AssignedSortParm, currentFilter=ViewBag.CurrentFilter })
</th>
<th class=col-sm-2 style ="text-align:left">
@Html.ActionLink("Contracting Org", "Index", new { sortOrder = ViewBag.ClientSortParm, currentFilter=ViewBag.CurrentFilter })
</th>
<th class=col-sm-1 style ="text-align:left">
@Html.ActionLink("Expires", "Index", new { sortOrder = ViewBag.ExpiresSortParm, currentFilter=ViewBag.CurrentFilter })
</th>
<th class=col-sm-1 style ="text-align:left">
@Html.ActionLink("LastActive", "Index", new { sortOrder = ViewBag.LastActiveSortParm, currentFilter=ViewBag.CurrentFilter })
</th>
<th scope="col" colspan="2" style=" width:10%; text-align:center">
Action
</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model) {
<tr class="table-light">
<td align="left">
@Html.DisplayFor(modelItem => item.Id)
</td>
<td align="left">
@Html.DisplayFor(modelItem => item.Name)
</td>
<td align="left">
@Html.DisplayFor(modelItem => item.IsStudy)
</td>
<td align="left">
@Html.DisplayFor(modelItem => item.Org.ShortName)
</td>
<td align ="left">
@Html.DisplayFor(modelItem => item.ContractingOrg.ShortName)
</td>
<td align="left">
@Html.DisplayFor(modelItem => item.ExpireDate)
</td>
<td align="left">
@Html.DisplayFor(modelItem => item.ActiveDate)
</td>
<td style="text-align: center">
<a asp-action="Edit" asp-route-id="@item.Id">
<i class="fas fa-edit"></i>
</a>
</td>
<td style="text-align: center">
<a asp-action="Details" asp-route-id="@item.Id">
<i class="fa-solid fa-eye" style="color:blue"></i>
</a>
</td>
</tr>
}
</tbody>
</table>
</div>
<div class=" col-12 text-end">
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount @Html.PagedListPager(Model, page => Url.Action("Index", new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }))
</div>
進行上述所有更改后,您的視圖將像魅力一樣作業
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/510727.html
