Используйте устаревший пользовательский элемент управления ASP.NET ASCX в представлении MVC Razor - PullRequest
15 голосов
/ 29 октября 2011

Я пытаюсь реализовать страницу _Layout.cshtml MVC Razor, которая использует пользовательский элемент управления ascx WebForm (не-MVC). Я делаю это на основе раздела «Да» этой статьи Скотта Хэнслмана «Смешивание видов бритвы и главных страниц веб-форм с ASP.NET MVC 3» http://www.hanselman.com/blog/MixingRazorViewsAndWebFormsMasterPagesWithASPNETMVC3.aspx

В статье рассказывается, как использовать один и тот же пользовательский элемент управления ascx как на странице Siteform.Master веб-формы, так и на странице _Layout MVC Razor.

Из того, что я прочитал в другом месте в Stackoverflow , можно использовать устаревшие пользовательские элементы управления ascx (а также серверные элементы управления веб-формы ASP.NET) на страницах MVC. Использование следующей строки должно отобразить пользовательский элемент управления ascx в моей Razor _Layout:

@{ Html.RenderPartial("~/UserControls/WebUserControl1.ascx"); }

Однако, это выдает ошибку:

The view at '~/UserControls/WebUserControl1.ascx' must derive from ViewPage,
ViewPage<TModel>, ViewUserControl, or ViewUserControl<TModel>.

Я также пробовал ниже с похожими результатами:

@Html.Partial("~/UserControls/WebUserControl1.ascx")

Что мне здесь не хватает?

Ответы [ 3 ]

16 голосов
/ 19 марта 2013

Как говорится в сообщении об ошибке, пользовательский элемент управления "должен быть производным от ... ViewUserControl". В файле кода для вашего пользовательского элемента управления просто измените это ...

public partial class WebUserControl1 : UserControl
{
    // ...
}

... к этому:

public partial class WebUserControl1 : ViewUserControl
{
    // ...
}

ViewUserControl наследуется от UserControl, поэтому он будет продолжать работать на ваших существующих страницах WebForms.

Возможно, вам придется иметь дело с дополнительными проблемами помимо этой, чтобы заставить ваш пользовательский элемент управления работать в MVC. По крайней мере, одна другая, с которой я столкнулся (на которую ссылается SLaks ):

Элемент управления 'controlId' типа 'controlType' должен быть помещен в тег формы с помощью runat = server.

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

Например, вам придется заменить такие вещи, как <asp:TextBox ID="search"> на <input type="text" name="search" />, что означает, что вам также нужно изменить код на стороне сервера, который обрабатывает значение, поступающее из этого ввода. По сути, вы должны нейтрализовать пользовательский элемент управления, преобразовав его из чего-то, что использовалось для воплощения логики рендеринга представлений и логики постобработки, во что-то, что просто визуализирует представление.

Вы можете заставить один ascx элемент управления хорошо играть как с WebForms, так и с Razor MVC, а для простых вещей, таких как верхние и нижние колонтитулы страниц или представления данных только для чтения, это хороший подход для переноса приложение к MVC. Но для более сложных вещей, таких как формы ввода, вероятно, будет проще поддерживать пользовательский элемент управления ascx и представление MVC Razor.

9 голосов
/ 22 октября 2015

вы можете использовать пользовательский элемент управления asp.net в MVC следующим образом

1-е изменение наследования пользовательского элемента управления, как по умолчанию

по умолчанию:

public partial class TestControl: UserControl
{
// ...
}

изменение:

public partial class TestControl: ViewUserControl
{
// ...
}`

Второй пользовательский элемент управления с такими элементами управления asp.net, как этот, в теге формы и диспетчере скриптов должен быть вызван

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TestControl.ascx.cs" Inherits="TestApp.UserControls.TestControl" %>

<div>
<h1>Welcome Test User Control</h1>
<form id="test" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:TextBox runat="server" ID="txtbxTest" Text="Hello">

</asp:TextBox>
</form>
</div>

3-й вызов пользовательского элемента управления в MVC Просмотреть как

@{ Html.RenderPartial("~/UserControls/TestControl.ascx"); }

он должен работать без каких-либо проблем, и будет полезно преобразовать старый сайт asp.net в MVC, если старый сайт имеет пользовательские элементы управления, его так легко обновить с помощью новой технологии в MVC.

3 голосов
/ 29 октября 2011

В ASP.Net MVC нельзя использовать классические пользовательские элементы управления ASP.Net (с postbacks и ViewState).

Html.Partial позволяет отображать только частичные представления, в которых используется то же расширение, ноне одинаковы.

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