Преобразование C # в VB.Net - Использование MVCContrib Blockrenderer для визуализации частичного представления строки - PullRequest
0 голосов
/ 11 июня 2009

Мне нужно сделать частичное представление строки, и я пытаюсь преобразовать пример C # в VB.Net, так как я застрял с этим для этого проекта.

Это вызывает у меня головную боль от этих двух проблем:

  1. ObjectViewData - я не могу понять, что это такое
  2. RenderPartial является подпрограммой, но, кажется, используется как функция - я не понимаю

Я ссылаюсь на MVCContrib.UI, поэтому мне не нужно конвертировать это. Но эти две функции мне нужно преобразовать:

(из brightmix.com )

/// Static Method to render string - put somewhere of your choosing
public static string RenderPartialToString(string userControl, object viewData, ControllerContext controllerContext)
{
    HtmlHelper h = new HtmlHelper(new ViewContext(controllerContext, new WebFormView("omg"), null, null), new ViewPage());
     var blockRenderer = new BlockRenderer(controllerContext.HttpContext);

     string s = blockRenderer.Capture(
         () => RenderPartialExtensions.RenderPartial(h, userControl, viewData)
     );

     return s;
 }

 /// Your Controller method...  
 public ActionResult MakeStringForMe()
 {
     var objectViewData = new objectViewData { SomeString = "Dude", SomeNumber = 1 };

     string s = RenderPartialToString("~/Views/Controls/UserControl.ascx", objectViewData, this.ControllerContext);

     View();
 }

Вот моя попытка конвертировать его в VB.Net

'Static Method to render string - put somewhere of your choosing'
Public Shared Function RenderPartialToString(ByVal userControl As String, ByVal viewData As Object, ByVal controllerContext As ControllerContext) As String

    Dim h As New HtmlHelper(New ViewContext(controllerContext, New WebFormView("omg"), Nothing, Nothing), New ViewPage())

    Dim blockRenderer As New MvcContrib.UI.BlockRenderer(controllerContext.HttpContext)

    Dim s As String = blockRenderer.Capture(RenderPartialExtensions.RenderPartial(h, UserControl, viewData))

End Function

Public Function MakeStringForMe() As ActionResult

    Dim objectViewData As objectViewData = New objectViewData With {.SomeString = "Dude", .SomeNumber = 1}
    Dim s As String = RenderPartialToString("~/Views/Controls/UserControl.ascx", objectViewData, Me.ControllerContext)
    View()
End Function

alt text

Ответы [ 4 ]

2 голосов
/ 11 июня 2009

Эта строка:

Dim s As String = blockRenderer.Capture(RenderPartialExtensions.RenderPartial(h, UserControl, viewData))

НЕ эквивалентно вашей исходной строке:

string s = blockRenderer.Capture(
         () => RenderPartialExtensions.RenderPartial(h, userControl, viewData)
     );

В примере C # используется лямбда-выражение, а в примере VB просто вызывается метод напрямую, который не возвращает значение. Компилятор вам не врет.

Попробуйте вместо этого:

Dim s = blockRender.Capture(New Action(Of String)(Function() RenderPartialExtensions.RenderPartial(h, UserControl, viewData)))

Я посмотрел на Capture, и он ожидает Action, который является просто делегатом, и похоже, что компилятор не может вывести подпись делегата для переноса анонимной функции. Поэтому мы протянем ему руку помощи и сами завернем лямбду.

0 голосов
/ 11 июня 2009

Мой любимый конвертер можно найти по по этой ссылке

Причина, по которой он мой любимый, заключается в том, что его можно использовать "в автономном режиме", то есть не на их веб-странице. Конвертер представлен в виде веб-службы, и есть пример кода (на C #) для ссылки на него.

Я скачал их пример кода и адаптировал его для чтения и записи из файловой системы. Сделал преобразование на целом намного проще ....

Я знаю, что ссылка на самом деле не идет на конвертер - она ​​идет на страницу "о", со ссылками оттуда на страницу конвертера и на образец загрузки кода. Кроме того, я должен упомянуть, что это трехсторонний преобразователь (VB, C # и Boo), двунаправленный между любыми двумя языками

0 голосов
/ 11 июня 2009

RenderPartialToString должен вернуть строку, с

0 голосов
/ 11 июня 2009

Вы можете сделать это вручную или попробовать использовать http://www.developerfusion.com/tools/convert/csharp-to-vb/

РЕДАКТИРОВАТЬ: также ваш код имеет

View() 

в конце

Public Function MakeStringForMe() 

это должно быть

Return View()

В ответ на пункт 2 код не использует подпрограмму renderPartial, а использует функцию RenderPartialToString.

НТН

ONESHOT

...