Как получить Url.Action внутри метода расширения - PullRequest
2 голосов
/ 23 сентября 2011

Я использую MVC3 (VB) с механизмом представления Razor, и я использую помощник Chart для создания ряда диаграмм.У меня работает этот код:

В представлении:

<img src="@Url.Action("Rpt002", "Chart", New With {.type = "AgeGender"})" alt="" />

, которое запускает это действие в контроллере диаграммы:

    Function Rpt002(type As String) As ActionResult
        Dim chart As New System.Web.Helpers.Chart(300, 300)
        '...code to fill the chart...
        Return File(chart.GetBytes("png"), "image/png")
    End Function

Поскольку у меня есть номердиаграмм по нескольким представлениям, я хотел поместить создание img в вспомогательную функцию.Я думал, что будет работать следующее:

<System.Runtime.CompilerServices.Extension>
Public Function ReportChart(htmlHelper As HtmlHelper, action As String, type As String) As MvcHtmlString

    Dim url = htmlHelper.Action(action, "Chart", New With {.type = type})
    Return New MvcHtmlString(
        <img src=<%= url %> alt=""/>
    )

End Function

Когда я пытаюсь это сделать, я получаю следующую ошибку:

OutputStream is not available when a custom TextWriter is used.

Я думал, что вызов "htmlHelper.Action" просто сгенерирует URLтак что я мог бы добавить его к IMG, но это фактически вызывает действие.Как получить эквивалент «Url.Action» из метода расширения?

1 Ответ

6 голосов
/ 23 сентября 2011

Просто создайте экземпляр UrlHelper и вызовите для него метод Действие :

Dim urlHelper as New UrlHelper(htmlHelper.ViewContext.RequestContext);
Dim url = urlHelper.Action(action, "Chart", New With {.type = type})

Также я бы порекомендовал вам использовать TagBuilder, чтобы убедиться, что генерируемая разметка является действительной и что атрибуты правильно закодированы:

<System.Runtime.CompilerServices.Extension> _
Public Shared Function ReportChart(htmlHelper As HtmlHelper, action As String, type As String) As IHtmlString
    Dim urlHelper = New UrlHelper(htmlHelper.ViewContext.RequestContext)
    Dim url = urlHelper.Action(action, "Chart", New With { _
        Key .type = type _
    })
    Dim img = New TagBuilder("img")
    img.Attributes("src") = url
    img.Attributes("alt") = String.Empty
    Return New HtmlString(img.ToString())
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...