Подтвердить что ты не робот

Использовать устаревший пользовательский элемент управления ASP.NET ASCX в представлении MVC Razor

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

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

Из того, что я читал qaru.site/info/399721/..., на страницах MVC можно использовать устаревшие пользовательские элементы управления ascx (а также элементы управления веб-шаблонами ASP.NET). Использование следующей строки должно отображать пользовательский элемент управления 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")

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

4b9b3361

Ответ 1

Как указано в сообщении об ошибке, пользовательский элемент управления "должен основываться на... 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.

Ответ 2

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

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

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

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

изменения:

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

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

<%@ 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

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

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