WebGrid: невозможно преобразовать «лямбда-выражение» в «System.Func‹dynamic,object›»

Я пытаюсь обработать случай DateTime, который может быть нулевым при рендеринге в ASP.NET MVC3 WinGrid. Я получаю сообщение об ошибке при попытке установить WebGridColumn. У меня есть одна работающая, другая нет. Тот, который работает, менее понятен, поскольку html генерируется внутри вспомогательной функции. Чего я не могу понять, так это почему идеальный вариант не работает.

Вот тот, который работает:

$gridSummary.Column("OngoingDate", 
    header: "Ongoing", 
    format: Html.DateTimeActionLink, 
    style: "ongoingDate")

public static object DateTimeActionLink(this HtmlHelper htmlHelper, dynamic item)
{
    DateTime? linkDateTime = item.OngoingDate;
    if (linkDateTime != null && linkDateTime.HasValue)
    {
        var x = linkDateTime.Value.ToString("MM/dd/yyyy");
        return LinkExtensions.ActionLink(htmlHelper, x, "Edit", "MdsAsmtSectionQuestions", new { mdsId = item.OngoingId }, null);
    }

    return MvcHtmlString.Empty;
}       

вот тот, который не работает:

    $gridSummary.Column("AssessmentInfo", header: "Open Type | ARD",
                        format: (item) =>
                        {
                            return Html.DateTimeActionLink(
                                item.AssessmentDate,
                                "MM/dd/yyyy",
                                x => Html.ActionLink(item.AssessmentInfo + " | " + x, "Edit", "MdsAsmtSectionQuestions", new { mdsId = item.OngoingId }, null));
                        },
                        style: "assessmentInfo")

    public static object DateTimeActionLink(this HtmlHelper htmlHelper, dynamic item, string format, Func<string, MvcHtmlString> actionLink)
    {
        Nullable<DateTime> linkDateTime = item;

        if (linkDateTime != null && linkDateTime.HasValue)
            return actionLink(linkDateTime.Value.ToString(format));

        return MvcHtmlString.Empty;
    }

person Sam Carleton    schedule 15.06.2012    source источник
comment
возможный дубликат формат ASP.NET MVC3 WebGrid: параметр   -  person Kirk Woll    schedule 16.06.2012
comment
Я только что попробовал следующее, приведя параметр к DateTime? и я получаю ту же ошибку. Я неправильно понимаю исправление в ссылке, которую вы разместили? gridSummary.Column(AssessmentInfo, заголовок: Open Type | ARD, формат: (item) => DateTimeActionLink( (DateTime?) item.AssessmentDate, MM/dd/yyyy, x => Html.ActionLink(item.AssessmentInfo + | + x , Редактировать, MdsAsmtSectionQuestions, новый { mdsId = item.OngoingId }, null))   -  person Sam Carleton    schedule 16.06.2012


Ответы (2)


Вместо:

...
format: (item) =>
                        {
                            return Html.DateTimeActionLink(
                                item.AssessmentDate,
                                "MM/dd/yyyy",
                                x => Html.ActionLink(item.AssessmentInfo + " | " + x, "Edit", "MdsAsmtSectionQuestions", new { mdsId = item.OngoingId }, null));
                        }
...

Пытаться:

...
format: (item) =>
                            Html.DateTimeActionLink(
                                    //added cast
                                    (Nullable<DateTime>)(item.AssessmentDate),
                                    "MM/dd/yyyy",
                                    //added cast
                                    x => Html.ActionLink((string)(item.AssessmentInfo) + " | " + x, "Edit", "MdsAsmtSectionQuestions", new { mdsId = item.OngoingId }, null));
...
person JP Del Mundo    schedule 15.06.2012
comment
Не работает. Все, что он делает, это отображает код в ‹тексте›. - person Sam Carleton; 16.06.2012
comment
Отредактировано, вместо Html.DateTimeActionLink(..., заменено на @Html.DateTimeActionLink(..., обратите внимание на использование @ - person JP Del Mundo; 16.06.2012
comment
извините, но добавление @ перед Html тоже не сработало. - person Sam Carleton; 16.06.2012
comment
ОК, по какой-то причине формат имеет проблемы с динамическими типами, я отредактировал ответ, чтобы показать это правильно - person JP Del Mundo; 16.06.2012
comment
Обратите внимание на приведение перед динамическими типизированными объектами (Nullable‹DateTime› и строка) - person JP Del Mundo; 16.06.2012
comment
JP Del Mundo, Спасибо. Их было два, один с основной струной, которую я не показывал. Это сработало, как только я попробовал Nullable‹DateTime›. Я пробовал DateTime? но это не сработало, не понимал, что будет разница, но она была:) Я также добавил приведение к конкатенации строк, что требовалось. Я ценю помощь! - person Sam Carleton; 18.06.2012

Вы не можете использовать лямбда-выражения с текущей версией Razor. Базовые классные, но помимо этого они ломаются. Я думаю, что Razor 2.0 поддерживает это, но я должен проверить :)

Нет ничего плохого в использовании помощников HTML. Вот для чего они там. Учитывая, что вы в основном вызываете один и тот же код. Если вы планируете использовать вспомогательный метод в другом месте, у вас не будет дублирования кода. Держите его СУХИМ.

Кроме того, я не уверен, почему у вас есть $. Я совершенно уверен, что вам нужен символ @, поскольку это метод С#, а не jQuery.

person Buildstarted    schedule 16.06.2012