在foreach语句中解压缩viewdata

时间:2011-06-01 09:33:53

标签: entity-framework asp.net-mvc-3

所以我在viewdata语句中打包了一些查询结果。

我可以使用此指令验证在视图中将正确数量的结果放入viewdata对象中:

@foreach (var action in (List<LemonadeTrader.Models.Message>)ViewData["messages"]) {

当我尝试显示结果时:

@Html.DisplayFor( (LemonTrader.Models.Message)action.msg)   // action.msg should be of type string

它说它无法将字符串转换为LemonTrader.Models.Lemon。

当我把它投射为:

@Html.DisplayFor( (string)action.acidity)

它说:

  

方法的类型参数   “System.Web.Mvc.Html.DisplayExtensions.DisplayFor(System.Web.Mvc.   的HtmlHelper,   System.Linq.Expressions.Expression&GT)”   无法从使用中推断出来。尝试   指定类型参数   明确。

完全没有施放它也不起作用。

如何投射结果?

3 个答案:

答案 0 :(得分:1)

DisplayFor/EditorFor适用于强类型视图和视图模型。它将lambda表达式作为第一个参数,它表示您尝试显示/编辑的视图模型上的属性。所以将这个ViewData扔进垃圾箱(它所属的地方)并使用视图模型和强类型视图。

所以不是以下恐怖:

@foreach (var action in (List<LemonadeTrader.Models.Message>)ViewData["messages"]) {

您将拥有一个视图模型,其Message属性的类型正确:

@foreach (var action in Model.Messages) {

甚至更好(为什么在dislpay /编辑模板已经执行此操作时编写foreach循环):

@Html.DisplayFor(x => x.Messages)

这样你获得了很多奖金:

  • 您的代码可以使用
  • 你得到intellisense
  • 没有更多脆弱的魔法字符串
  • 而不是像一些意大利面条代码,你的观点变得更具可读性
  • ...

答案 1 :(得分:0)

我认为这只是一个语法错误,因为DisplayFor需要一个将模型作为输入的Func。 试试这个:@Html.DisplayFor(m => (string)action.acidity)

答案 2 :(得分:0)

这有效:

@foreach (var action in (List<LemonTrader.Models.Message>)ViewData["lemons"]) {
    <tr>
        <td>
            @Html.Encode( action.acidity)