ASP.NET MVC3 — Использование Html.ActionLink

#asp.net #asp.net-mvc-3 #html.actionlink

#asp.net #asp.net-mvc-3 #html.actionlink

Вопрос:

Мне нужно использовать Html.ActionLink в формате: свойство сетки.Спецификация столбца. Мой код выглядит следующим образом:

 grid.GetHtml(

  grid.Columns( 
    grid.Column(header: "Column 1", format: (item) => @<div class='webgrid-bookname-column-style'> @item.BookName </div>),
    grid.Column(header: "Column 2", format: (item) => Html.ActionLink(item.StartTime, "ShowShippingFileMessage", new { @id = item.BookName }))
  )
)
  

Когда я использую этот синтаксис, он выдает ошибку компиляции
Наилучший перегруженный метод, соответствующий для System.Web.Helpers.WebGrid.Column(string, string, System.Func<dynamic,object>, string, bool) , имеет некоторые недопустимые аргументы
Когда я меняю элемент.Начните с обычного текста, такого как «Редактировать», тогда он будет работать нормально.

Я новичок в ASP.NET , может кто-нибудь, пожалуйста, помочь мне понять, что не так с приведенными выше утверждениями?

Заранее спасибо.

Ответ №1:

Параметр format имеет тип Func<dynamic, HelperResult> .
Он должен возвращать a HelperResult , а не an IHtmlString .
Он определен таким образом, чтобы вы могли передавать встроенного помощника.
Чтобы передать встроенного помощника, удалите (item) => ; встроенные помощники неявно генерируют лямбда-выражение с item параметром.
Чтобы передать обычное лямбда-выражение, вам нужно заставить его возвращать HelperResult экземпляр.
HelperResult s возьмите Action<TextWriter> , чтобы вы написали

 item => new HelperResult(w => w.Write(Html.ActionLink(...).ToHtmlString()))
  


РЕДАКТИРОВАТЬ: я не понял, что параметр объявлен как Func<dynamic, object> . Это означает, что вы можете либо передать встроенный помощник, либо любое другое лямбда-выражение.
Ваш второй пример должен работать.

Вы также можете использовать встроенный помощник. Чтобы сделать это без HTML-тега, используйте специальный <text> тег:

 item => @<text>@Html.ActionLink(...)</text>
  

Razor удалит <text> из вывода.

Комментарии:

1. Спасибо за ваш быстрый ответ. Я попробовал оба варианта, но это не помогло. Я все еще получаю ту же ошибку.

2. Это то же сообщение об ошибке. Не изменилось —- CS1502: наилучшее соответствие перегруженного метода для System.Web.Helpers. Веб-сетка. Столбец (строка, строка, система. Функция <динамический, объект>, строка, bool)’ имеет некоторые недопустимые аргументы

3. Я не уверен, понял ли я ваш вопрос. Но это то, что я получаю с веб-страницы ——————————— Index.cshtml(96,17): ошибка CS1502: наилучший перегруженный метод соответствует ‘System.Web.Helpers. Веб-сетка. Столбец (строка, строка, система. Функция <динамический, объект>, строка, bool)’ имеет некоторые недопустимые аргументы Index.cshtml(98,27): ошибка CS1503: Аргумент 3: не удается преобразовать из ‘лямбда-выражения’ в ‘System. Функция <динамический, объект>’

4. Обычно это означает, что у вас есть какая-то синтаксическая ошибка в вашем лямбда.

5. Попробуйте new { id = (string)item.BookName }

Ответ №2:

Передаваемая строка отображения имеет тип DateTime . Попробуйте ввести строку.

 grid.Column(header: "Column 2", format: (item) => Html.ActionLink(item.StartTime.ToString(), "ShowShippingFileMessage", new { @id = item.BookName }))