web-dev-qa-db-ja.com

MVCRazorビューでレガシーASP.NETASCXユーザーコントロールを使用する

WebForm ascxユーザーコントロール(非MVC)を使用するMVC Razor_Layout.cshtmlページを実装しようとしています。これは、ScottHanslemanの記事「ASP.NETMVC3を使用したRazorビューとWebFormsマスターページの混合」の「はい」セクションに基づいて行っています http://www.hanselman.com/blog/MixingRazorViewsAndWebFormsMasterPagesWithASPNETMVC3.aspx

この記事では、WebフォームのSite.MasterページとMVC Razor_Layoutページの両方で同じascxユーザーコントロールを使用する方法について説明しています。

私が読んだことから Stackoverflowの他の場所 MVCページでレガシーascxユーザーコントロール(およびASP.NET Webフォームサーバーコントロール)を使用することが可能です。次の行を使用すると、Razor_Layoutでascxユーザーコントロールがレンダリングされます。

@{ 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")

ここで何が欠けていますか?

16
Walter

エラーメッセージに示されているように、ユーザーコントロールは「... ViewUserControlから派生する必要があります」。ユーザーコントロールのコードビハインドファイルで、これを変更するだけです...

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

...これに:

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

ViewUserControlUserControlを継承するため、既存のWebFormsページで引き続き機能します。

ただし、MVCでユーザーコントロールを機能させるには、これ以外の追加の問題に対処する必要がある場合があります。私が遭遇した他の少なくとも1つは( SLaks によってほのめかされています):

タイプ「controlType」のコントロール「controlId」は、runat = serverのフォームタグ内に配置する必要があります。

このようなものに遭遇した場合、あなたは創造的にならなければならないでしょう。ユーザーコントロールを変更して、WebFormsとMVCの両方で問題なく動作できるようにするか(問題のあるコントロールを一般的なHTMLに相当するものに置き換えます-そのすべての意味を持ちます)、WebFormsバージョンとMVCバージョンになるように複製します。

たとえば、<asp:TextBox ID="search">などを<input type="text" name="search" />に置き換える必要があります。つまり、その入力からの値を処理するサーバー側のコードも変更する必要があります。基本的に、ユーザーコントロールを無効にして、ビューレンダリングロジックポストバック処理ロジックの両方を具体化するために使用されていたものから、ビューをレンダリングするだけのものに変換する必要があります。

あなたはcan1つのascxコントロールをWebFormsとRazorMVCの両方で、そしてページのヘッダーやフッターや読み取りなどの単純なものでうまく機能させることができます-データのビューのみこれは、アプリケーションをMVCに移行するための優れたアプローチです。ただし、入力フォームなどのより複雑なものの場合は、ascxユーザーコントロールとMVCRazorビューの両方を維持する方がおそらく簡単です。

17

次の方法でMVCでasp.Netユーザーコントロールを使用できます

最初にユーザーコントロールの継承をデフォルトで変更します

デフォルト:

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

変化する:

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

フォームタグとスクリプトマネージャー内のこのようなasp.netコントロールを使用した2番目のユーザーコントロールを呼び出す必要があります

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

MVCビューでの3番目の呼び出しユーザーコントロール

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

問題なく動作するはずです。古いWebサイトにユーザーコントロールがある場合は、古いasp.net WebサイトをMVCに変換すると、MVCの新しいテクノロジに簡単にアップグレードできます。

9
adnan

ASP.Net MVCでは、従来のASP.Netユーザーコントロール(ポストバックとViewStateを含む)を使用できません。

Html.Partialは、同じ拡張子を使用しているが同じではない部分ビューのみをレンダリングできます。

3
SLaks