![](/img/trans.png)
[英]Passing two or more parameters from model view to controller in EF Core / ASP.NET Core MVC application
[英]Passing joined table to view as model Asp.Net Core
我有 2 個通過 linq 查詢加入的表:
var catData = from c in _context.ProductCategory
join d in _context.ProductCategoryData
on c.Id equals d.ProductCategoryId into g
from gg in g.DefaultIfEmpty()
select new { c.Id, c.Name, gg.Path };
我想將此查詢的結果作為 model 傳遞給查看。 問題是視圖需要強烈指定類型的 model 我正在傳遞。
我聽說可以引入另一個 class,它將包含 2 個表模型,然后將 2 個表加入這個 class。 但是,在我看來,它效率不高,因為我將始終擁有兩個表中的所有列,而我只需要特定的列。
我想到的另一個選擇 - 使用如下所示的 ExpandoObject:
dynamic model = new ExpandoObject();
model = catData.ToList();
return View("Categories", model);
然后在視圖中訪問動態 object,如下所示:
@model dynamic;
@foreach (var i in Model)
{
<img src="@i.Path">
<p>@i.Name</p>
}
但是,這會引發錯誤,即 Model object 不包含路徑或名稱。
有沒有其他方法可以解決這個問題?
最好的方法是創建一個新的 CatData 和 ViewModel 類
public class CatData
{
public int Id {get; set;}
public string Name {get; set;}
public string Path {get; set;}
}
public class CatDataViewModel
{
public IEnumerable<CatData> CatDataList {get; set;}
}
修復您的查詢
var catData = ( from ...
select new CatData { Id= c.Id, Name =c.Name, Path= gg.Path }
).ToList();
var model= new CatDataViewModel { CatDataList=catData };
並查看
@model CatDataViewModel;
@foreach (var i in Model.CatDataList)
{
<img src="@i.Path">
<p>@i.Name</p>
}
您需要的是IEnumerable<dynamic>
而不是dynamic
的。 dynamic
僅用作 object 公開屬性/方法,並且不能是任意對象的IEnumerable
。 如您所見, ExpandoObject
實際上是鍵值對的IEnumerable
(成員名稱和成員值之間的映射)。 但這不是你想要的那種IEnumerable
。
這段代碼:
dynamic model = new ExpandoObject();
model = catData.ToList();
實際上會將您的model
設置為{ c.Id, c.Name, gg.Path }
的列表。 所以它不像你想象的那樣動態。
以下是構建IEnumerable<dynamic>
的方法:
var model = catData.Select(e => {
dynamic o = new ExpandoObject();
o.Id = e.Id;
o.Name = e.Name;
o.Path = e.Path;
return o;
});
model 是一個真正的IEnumerable<dynamic>
,它現在應該可以工作了。
您還可以編寫一個擴展方法來將普通的IEnumerable<T>
轉換為IEnumerable<dynamic>
以使用這種特殊場景,如下所示:
public static class DynamicEnumerableExtensions {
public static IEnumerable<dynamic> AsDynamic<T>(this IEnumerable<T> items) {
var props = typeof(T).GetProperties();
foreach(var item in items)
{
var o = new ExpandoObject();
//set properties for the dynamic item
foreach(var prop in props)
{
o.TryAdd(prop.Name, prop.GetValue(item));
}
yield return o;
}
}
}
並像這樣使用它:
var model = catData.AsDynamic();
使用這種方便的方法,您不必每次都手動重寫邏輯,例如任意匿名對象的新列表(具有未知數量的屬性)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.