MVC3 Ajax.Ссылка на изображение в веб-сетке

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

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

Вопрос:

Я пытаюсь заполнить ячейку WebGrid изображением, которое откроет всплывающее окно «Подробности», основанное на том, какая строка выбрана. В настоящее время у меня есть это для столбца сведений:

 grid.Column(header: "Details", format: (item) => @Ajax.ActionLink("pop", "GetDetails", new { id = item.FormId }, new AjaxOptions { HttpMethod = "GET", UpdateTargetId = "formdetails", InsertionMode = InsertionMode.Replace, OnSuccess = "openPopup" })
                                          , style: "colImages"),
 

Это нормально открывает всплывающее окно, но в столбце вместо изображения появляется текст «pop».

Я видел несколько сайтов, на которых говорилось о создании отдельного класса «ImageActionLink», чтобы помочь в создании объектов ActionLink с изображениями. Этот код выглядит следующим образом:

 public static class ImageActionLinkHelper
{
    public static IHtmlString ImageActionLink(this AjaxHelper helper, string imageUrl, string altText, string actionName, object routeValues, AjaxOptions ajaxOptions)
    {
        var builder = new TagBuilder("img");
        builder.MergeAttribute("src", imageUrl);
        builder.MergeAttribute("alt", altText);
        var link = helper.ActionLink("[replaceme]", actionName, routeValues, ajaxOptions).ToHtmlString();
        return new MvcHtmlString(link.Replace("[replaceme]", builder.ToString(TagRenderMode.SelfClosing)));
    }
} 
 

Однако, похоже, я не могу заставить этот код работать В WebGrid. В основном это связано с тем, что мне нужна часть «(item) =>», чтобы получить идентификатор строки, чтобы появилось правильное окно сведений.

Как я могу сделать так, чтобы столбец «Подробности» содержал маленький значок, при нажатии на который будет отображаться правильное всплывающее окно? Заранее спасибо.

Редактировать: вот несколько способов, которыми я пытался использовать ImageActionLink

 grid.Column(... format: (item) => @Ajax.ImageActionLink( ... ) ),
 

Ошибка: Аргумент 3: не удается преобразовать из ‘лямбда-выражения’ в ‘System.Функция ‘

 grid.Column(... format: (item) => @(new HtmlString(@Ajax.ImageActionLink( ... ) ),
 

Ошибка: ключевое слово, идентификатор или строка ожидаются после дословного спецификатора: @

 grid.Column(... format: (item) => @HtmlString(@Ajax.ImageActionLink( ... ) ),
 

Ошибка: ‘System.Web.HtmlString’ является ‘типом’, но используется как ‘переменная’

 grid.Column(... format: @HtmlString((item) => @Ajax.ImageActionLink( ... ) ),
 

Ошибка: ‘System.Web.HtmlString’ является ‘типом’, но используется как ‘переменная’

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

1. Можете ли вы опубликовать какой-нибудь пример кода, как вы пытались использовать этот ImageActionLink метод?

Ответ №1:

Я создал небольшой репозиторий, и со следующим синтаксисом он работает для меня. Одна важная вещь: вам нужно включить using для вашего пространства имен ImageActionLinkHelper класса в верхней части вашего представления.

 @using namespaceofImageActionLinkHelper
...

grid.Column(header: "Details",
                    format: (item) => 
                        @Ajax.ImageActionLink(
                            @Url.Content("~/Content/images/image.jpg"),
                            "alt of the image",
                            "GetDetails",
                            new { id = item.FormId },
                            new AjaxOptions { HttpMethod = "GET", UpdateTargetId = "formdetails", InsertionMode = InsertionMode.Replace, OnSuccess = "openPopup" })                    
                    , style: "colImages")