【发布时间】:2010-09-21 08:44:25
【问题描述】:
警告:这可能是对 C# 动态关键字的不当使用,我可能应该使用强类型视图模型,但是...
我试图通过将 C# 4 动态类型传递给我的视图来避免创建强类型视图模型。我的控制器中有这个:
public ActionResult Index()
{
var query =
from fr in db.ForecastRates
join c in db.Codes
on
new { Code = fr.RateCode, CodeType = "ForecastRate" }
equals
new { Code = c.CodeValue, CodeType = c.CodeType }
select new
{
RateCode = fr.RateCode,
RateCodeName = c.CodeName,
Year = fr.Year,
Rate = fr.Rate,
Comment = fr.Comment
};
// Create a list of dynamic objects to form the view model
// that has prettified rate code
var forecastRates = new List<dynamic>();
foreach (var fr in query)
{
dynamic f = new ExpandoObject();
f.RateCode = fr.RateCode;
f.RateCodeName = fr.RateCodeName;
f.Year = fr.Year;
f.Rate = fr.Rate;
f.Comment = fr.Comment;
forecastRates.Add(f);
}
return View(forecastRates);
}
...在我看来(我正在使用 MVC 3 的 Razor 视图引擎):
@inherits System.Web.Mvc.WebViewPage<IEnumerable<dynamic>>
...
<tbody>
@foreach (var item in Model) {
<tr>
<td>@item.RateCodeName</td>
<td>@item.Year</td>
<td>@item.Rate</td>
<td>@item.Comment</td>
</tr>
}
</tbody>
我不喜欢遍历 LINQ 结果以形成动态对象列表的方式。
我想在 LINQ 查询中初始化每个 ExpandoObject,但 that doesn't seem to be supported。
我尝试将查询结果转换为 List,但这不起作用,因为您无法将匿名类型转换为动态。
【问题讨论】:
-
您不喜欢迭代方式的哪些方面?为什么要避免使用强类型视图模型?哦,你肯定可以从匿名类型转换为动态类型,所以我不确定你的最后一点是想说什么......你是在谈论
List<T>中缺乏差异吗? ? -
我只是不想迭代以保持它有点干燥(想在 LINQ 查询中完成所有操作)。我想避免使用强类型视图模型,而是使用动态视图模型,因为我不想重复模型中的内容(并且因为我是一名想成为 Ruby 开发人员的 C# 开发人员:)。不过,也许我可以将模型子类化以形成视图模型?是的,我想将查询结果转换为 List
(这可能吗?)。谢谢! -
看看“粘土”。请参阅我对上一个问题的回答:stackoverflow.com/questions/3758157/…
标签: linq dynamic asp.net-mvc-3