Преобразование классического пользовательского элемента управления ASP.NET в MVC - PullRequest
3 голосов
/ 18 июня 2009

Хорошо, это для меня очень сложная задача. Мы берем наш существующий веб-сайт ASP.NET и конвертируем (перепроектируем только PL) в MVC. Наш сайт очень сложный. Но сложная часть состоит в том, чтобы преобразовать существующие пользовательские элементы управления в MVC. Пользовательские элементы управления (я не говорю о пользовательских элементах управления) - это, конечно, класс, который в настоящее время наследует System.Web.UI.Control и использует этот объект повсюду. Например, у нас есть некоторые свойства в верхней части этого существующего пользовательского класса, например:

Dictionary<int, Control> configControls; 
DropDownList kControl; 
CheckBox confirmBox;

Это все переменные типа веб-элементов управления в классическом ASP.NET.

Так что я подумал, что, возможно, что я мог бы сделать (не создавая полностью новые пользовательские элементы управления с нуля), это использовать объект HtmlHelper. Итак, я попробовал это:

(сначала включите оператор using, который включает System.Web.MVC.Html в начале моего нового пользовательского класса в нашем новом веб-проекте)

приватный помощник HtmlHelper; Словарь configControls; helper.DropDownList

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

Я не знаю эквивалента чему-то вроде универсального «элемента управления», который мы имели в наличии для наследования, например, в классическом ASP.NET. Конечно, в MVC это будет не то же самое (без сохранения состояния и совершенно другого способа работы), но что я могу использовать в MVC с таким же концептуальным видом?

Так что я подумал, что, возможно, что я мог бы сделать (не создавая полностью новые пользовательские элементы управления с нуля), это использовать объект HtmlHelper. Итак, я попробовал это:

(сначала включите оператор using, который включает System.Web.MVC.Html в начале моего нового пользовательского класса в нашем новом веб-проекте)

private HtmlHelper helper; 
Dictionary configControls; 
helper.DropDownList

но это не работает. Я даже не знаю, будет ли этот подход работать в моем пользовательском контроле. И когда я пытаюсь использовать свою вспомогательную переменную, я не получаю методы расширения, если только она не находится внутри существующего метода расширения, где в сигнатуру передается параметр HtmlHelper. Поэтому, когда я создаю эту частную переменную только в моем пользовательском классе снаружи, я ничего не получаю intellisense на выбор при выполнении «помощник». Так что мне нужно определить этот объект следующим образом:?

private HtmlHelper htmlHelper = new HtmlHelper();

но он запрашивает ViewContext и IViewDataContainer в качестве параметров. Если я создаю собственный метод, который еще ничего не знает о его представлении (в этом нет необходимости), потому что я просто создаю строки HMTL в этом пользовательском классе для передачи в метод Extension, чтобы в конечном итоге выплюнуть поля может быть, я не могу использовать HtmlHelper таким образом в пользовательском классе, подобном этому.

Так можно ли использовать этот объект каким-либо образом вместо «Контроля»? Может быть, я могу даже в моей словарной переменной использовать тип объекта вместо элемента управления? Я не знаю, а затем приведу объект к типу HtmlHelper, когда мне нужно использовать или ссылаться на это значение из словаря? Но сейчас я решил, что могу использовать объект HtmlHelper в Словаре, а затем создавать типы переменных из помощника. но это всего лишь методы расширения, а не объекты.

Надеюсь, у меня есть смысл, когда ты читаешь это.

Ответы [ 4 ]

4 голосов
/ 18 июня 2009

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

Веб-формы и MVC в гармонии - почти…

В основном обсуждаются некоторые варианты эмуляции "WebControls" с использованием MVC.

Кроме того, вы все еще можете использовать WebControls, как раньше (при условии, что они могут не работать, если им нужны такие вещи, как ViewState). Проблема, которую я обнаружил, заключается в том, что у вас отключение от встроенного кода рендеринга и самих WebControls.

Я вчера написал этот метод, который позволял вам использовать WebControls со встроенным кодом.

using System.Reflection;
using System.IO;
using System.Web.UI;
using System.Web;
using System.Web.Mvc;

public static class MyExtensionMethods {

//example method - renders a webcontrol to the page
public static void RenderControl(this HtmlHelper helper, Control control) {

    //perform databinding if needed
    MethodInfo bind = control.GetType().GetMethod("DataBind");
    if (bind is System.Reflection.MethodInfo) {
        bind.Invoke(control, null);
    }

    //render the HTML for this control
    StringWriter writer = new StringWriter();
    HtmlTextWriter html = new HtmlTextWriter(writer);
    control.RenderControl(html);

    //write the output
    HttpContext.Current.Response.Write(writer.ToString());

    //and cleanup the writers
    html.Dispose();
    writer.Dispose();
}

}

//then used like...
<% int[] numbers = { 1, 2, 3, 4, 5 }; %>
<% this.Html.RenderControl(new DataGrid() { DataSource = numbers }); %>

Просто интересная концепция, которая может вас заинтересовать.

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

Если не считать хакерских элементов управления веб-формами в приложении MVC, серверные элементы управления многими методами не отображаются в MVC.

Их заменяют партиалы и контроллеры (или субконтроллеры, если вам это нравится).

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

Серверные элементы управления, управляющие собственным состоянием, в MVC остались в прошлом.

Помните, что MVC - это попытка использовать Интернет так, как он должен был работать, особенно если вы добавляете REST в картину. Webforms - выдумка, чтобы заставить сеть работать как формы Windows.

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

Не уверен, насколько это будет полезно, но посмотрите на эту серию постов в блоге

Пользовательские элементы управления везде

Также взгляните на проект Catharsis Каркас веб-приложений - Catharsis - Часть I - Новое решение

URL кодекса для того же Catharsis

В этом проекте есть несколько хороших примеров создания элементов управления для asp.net mvc.

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

Я хотел бы создать необходимую бизнес-логику, разделить частичное представление (возможно, с большим количеством хорошо структурированных строк JavaScript) и отделить контроллер.

Тогда я бы использовал этот набор кода через частичный запрос технику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...