警告:这可能是对 C# 动态关键字的不当使用,我可能应该使用强类型 View 模型,但是...
我试图通过将 C# 4 动态类型传递给我的 View 来避免创建强类型 View 模型。我的 Controller 中有这个:
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 View 引擎):
@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 .
我尝试将查询结果转换为列表,但这不起作用,因为您无法将匿名类型转换为动态类型。
最佳答案
正如您所说,不支持。 (我并不是说不支持动态 View 模型 - 我是说不支持您想要做的事情)
您可能可以整理 LINQ 查询,但最终最好的选择是简单地创建一个自定义 View 模型。说真的,你大约需要 30 秒才能做到这一点。
我知道动态是新的、很酷的,但是如果您在这种情况下坚持使用自定义 View 模型,您的代码将会更加整洁且更易于维护。
我只会在非常简单的场景中使用动态 View 模型 - 大多数时候你可能想坚持我们一直在做的事情 - 自定义 View 模型。
关于linq - 在 ASP.NET MVC 3 中执行动态 View 模型的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3758612/