Формат ASP.NET MVC3 WebGrid: параметр - PullRequest
12 голосов
/ 26 февраля 2011

Я пытаюсь использовать новую WebGrid в ASP.NET MVC3, и в одном из столбцов я хочу отобразить набор значков ссылок, которые выполняют различные действия (Edit, View, Delete) ... Для этой цели у меня есть HtmlHelperрасширения, которые в основном выводят следующий HTML:

<a href="" title=""><img alt="" src="" /></a>

Расширение возвращает MvcHtmlString, и оно прекрасно работает, когда используется в представлениях Razor само по себе ... Например: @ Html.ActionLinkIconForEditAction ("Customer", 2)

Проблема в том, что мне нужно вызывать этого помощника (один раз для каждого действия) в столбце WebGrid при передаче идентификатора объекта.Проблема, с которой я сталкиваюсь, состоит в том, что компилятор выдает мне сообщение о том, что он не может преобразовать MvcHtmlString (или «лямбда-выражение» в зависимости от вызова, который я пытаюсь) в System.Func, ожидаемый форматом ...

Такнапример, это работает:

grid.Column(header: "", format: @<text>@Html.ActionLinkIconForEditAction("Customer", 2)</text>)

Но это не так:

grid.Column(header: "", format: (customer) => @<text>@Html.ActionLinkIconForEditAction("Customer", customer.Id)</text>)
grid.Column(header: "", format: (customer) => Html.ActionLinkIconForEditAction("Customer", customer.Id))

Я получаю:

Error 4 Argument 3: cannot convert from 'lambda expression' to 'System.Func<dynamic,object>'

или для этого вызова:

grid.Column(header: "", format: Html.ActionLinkIconForEditAction("Customer", customer.Id)),

Я получаю:

Error 5 Argument 3: cannot convert from 'System.Web.Mvc.MvcHtmlString' to 'System.Func<dynamic,object>'

Что странно У меня есть другие столбцы, которые используют лямбда-выражения, прямые методы доступа Model.Property и даже вывод из String.Format ("") ... Они всеработает нормально ... Я прочитал все документы по Func и этой ветке, а также , и до сих пор не могу понять это:)

Может кто-нибудь заметить, что я делаю неправильно?

Ответы [ 3 ]

15 голосов
/ 26 февраля 2011

Я понял :) .... Похоже, проблема в том, как C # обрабатывает динамические объекты ... Многие пользователи получают удовольствие от этого ...

Исправление было таким же простым, как приведение правильного типа параметра к моему помощнику расширения ... Так что это работает:

grid.Column(header: "", format: @<text>@Html.ActionLinkIconForEditAction("Customer", (int)item.Id)

Другая хитрость заключается в том, чтобы использовать «встроенный» в «объект» объект и не предоставлять свой собственный ... Так, например, это не работает:

grid.Column(header: "", format: (customer) =>  @<text>@Html.ActionLinkIconForEditAction("Customer", (int)customer.Id)

Много чтения, настройки, обучения ... Надеемся, что в следующей версии будет что-то намного проще в использовании, когда вам нужно добавить контент в столбцы, которые не поступают напрямую из модели ...

С уважением Z ...

1 голос
/ 03 сентября 2012

Мне пришлось создать код WebGrid в C # и отображать определенный столбец с помощью гиперссылки. Ни один из методов, упомянутых выше, не работал для меня. Итак, я использовал MvcHtmlString.create и передал ему возвращаемое значение String.format.


  format: (item) => MvcHtmlString.Create(string.Format((A HREF=\"/Inventory/EditInventory/{0}\"){1}(/A)", item.ID, item.Property))) 

Заменить (или) внутри строки на <или> соответственно.

1 голос
/ 25 июля 2012
grid.Column(format: (item) => Html.ActionLink("EditCustomer","Editcustomer", new {CustomerId=item.CustomerId}))

Это будет работать, и над одним также работать .. Здесь 1-й «EditCustomer» - это текст, который будет виден пользователям, второй «EditCustomer» - это имя действия, которое вы хотите перенаправить, и пункт

...