распаковка viewdata в выражении foreach - PullRequest
0 голосов
/ 01 июня 2011

Таким образом, я упаковал некоторые результаты запроса в оператор 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>) 'не может быть выведено из использования.Попробуйте указать аргументы типа в явном виде.

Не приведение его вообще не работает.

Как привести результат?

Ответы [ 3 ]

1 голос
/ 01 июня 2011

DisplayFor/EditorFor работает со строго типизированными представлениями и моделями представления.В качестве первого аргумента он принимает лямбда-выражение, представляющее свойство модели представления, которую вы пытаетесь отобразить / отредактировать.Так что бросьте это ViewData в мусорное ведро (где оно принадлежит) и используйте модели представлений и строго типизированные представления.

Так что вместо следующего ужаса:

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

У вас будетмодель представления со свойством Messages правильного типа:

@foreach (var action in Model.Messages) {

Или даже лучше (зачем писать циклы foreach, когда шаблоны dislpay / editor уже делают это):

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

Таким образом, вы получаете много бонусов:

  • ваш код будет работать
  • вы получите intellisense
  • больше не хрупкие магические строки
  • вместо того, чтобы походить нанекоторый код спагетти ваши взгляды становятся намного более читабельными
  • ...
0 голосов
/ 08 июня 2011

Это сработало:

@foreach (var action in (List<LemonTrader.Models.Message>)ViewData["lemons"]) {
    <tr>
        <td>
            @Html.Encode( action.acidity)
0 голосов
/ 01 июня 2011

Я думаю, что это просто синтаксическая ошибка, потому что DisplayFor ожидает Func, который получает вашу модель в качестве входных данных.Попробуйте это: @Html.DisplayFor(m => (string)action.acidity)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...