2011-11-01 4 views
0

У меня есть элемент управления ASP.NET WebForms (полученный от Control, а не WebControl, если он помогает), который имеет довольно сложную функцию Render(). Элемент управления не имеет viewstate и использует только подход Control, поэтому он может отображать вывод напрямую. Я считаю, что это прекрасный кандидат на работу с подходом MVC.ASP.NET MVC - преобразование сложного элемента управления в MVC-совместимый

Я хотел бы использовать его в приложении MVC, которое я использую, однако я не знаю, как лучше всего это сделать.

Сначала я подумал о том, чтобы преобразовать его в метод HTML Helper, но мой элемент управления отображает большое количество HTML, поэтому метод Helper (с его возвращающими строками) не слишком привлекателен.

Альтернативой является PartialView, но это производные UserControl, которые в этом случае не подходят.


Я вижу другие методы HTML Helper не возвращаются HTMLString, но на самом деле использовать HtmlHelper.ViewContext.Writer писать вывод напрямую, но по этому вопросу (HtmlHelper using ViewContext.Writer not rendering correctly) он получал странные результаты. Я бы хотел избежать этой неудачи.


EDIT:

Я думаю, что я решил его с помощью HtmlHelper.ViewContext.Writer подход, и я не испытывал такую ​​же проблему, как проблема, которую я цитировал.

Вот код, который я написал:

public static class MiniViewHelper { 

    public static void RenderMiniView<TModel>(this HtmlHelper html, MiniView<TModel> view, TModel model) { 

     TextWriter wtr = html.ViewContext.Writer; 
     HtmlTextWriter hwtr = wtr as HtmlTextWriter; 
     if(hwtr == null) hwtr = new HtmlTextWriter(wtr); 

     view.Render(hwtr); 
    } 

} 

public abstract class MiniView<TModel> { 

    public TModel Model { get; set; } 

    public abstract void Render(HtmlTextWriter wtr); 

} 

public class VeryComplicatedMiniView : MiniView<ComplicatedViewModel> { 

    public override void Render(HtmlTextWriter wtr) { 

     wtr.WriteLine("VeryComplicatedMiniView "); 
    } 

} 

Используется как и из моих страниц:

<% Html.RenderMiniView(new VeryComplicatedMiniView() { Propery1 = foo }, Model.RelevantMiniViewModel); %> 

Любые мысли?

ответ

1

Два подхода, которые вы изложили в своем вопросе, верны. Вы можете либо попытаться написать собственный HTML-помощник, который будет плюнуть на тот же HTML, что и элемент управления, или использовать частичный.

Я вижу другие методы HTML Helper не возвращаются HTMLString, но на самом деле использование HtmlHelper.ViewContext.Writer писать выход непосредственно

ViewContext.Writer должно быть хорошо. Возврат IHtmlString из помощника также прекрасен. Просто убедитесь, что вы правильно кодируете его внутри, так как IHtmlString не будет автоматически закодирован HTML в Razor, и он предполагает, что помощник позаботится об этом. Использование TagBuilder для генерации дерева DOM в помощнике - хороший подход.

+0

Спасибо. Я исправил свой вопрос с кодом, который я написал, чтобы решить проблему. Не могли бы вы дать мне несколько отзывов об этом? Благодаря! – Dai

Смежные вопросы