2011-03-15 18 views
0

私はシンプルなASCXユーザコントロール(非MVC)を持っています。ユーザーコントロールにはプロパティがあります(タイトルなどと呼ばせてください)。標準ASCX UserControlからのMVCモデルへのアクセス

私は、ユーザーコントロールを含むMVCパーシャルビューも持っています。私は私のコントロールの内部モデルのいくつかのプロパティにアクセスできるように...

<tag:Control ID="myControl" runat="server" Title="<%= Model.Title %>" /> 

:私は行うことができるようにしたいのですがどのような

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SomeModel>" %> 
<%@ Register TagPrefix="tag" TagName="Control" Src="~/path/to/ascx/control.ascx" %> 
... snip ... 
<tag:Control ID="myControl" runat="server" /> 

はこのようなものです。 残念ながら、このメソッドは動作しません。「これはスクリプトレットではありません。プレーンテキストとして出力されます」というメッセージが表示されます。

私も可能なことをしようとしていますか?もしそうなら、私はどのように試してやることができるでしょうか?

これは関連性がある場合、これはMVC 2コンポーネントを含む.Net 4プロジェクトです。

ありがとうございます! ニール

答えて

2

私も可能なことをしようとしていますか?

はいそれは 非常に醜いであろうと、それは(ASP.NET MVCビューで!!!)の背後にあるコードを使用することを含む:

<%@ Page 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="AppName.Views.Home.Index" 
    CodeBehind="Index.aspx.cs" 
%> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    Home Page 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
    <asp:Label ID="Txt" runat="server" /> 
</asp:Content> 

Index.aspx.cs背後に対応するコード(beurkで...、I)が嘔吐します:

:次のように改善することができ

public partial class Index : System.Web.Mvc.ViewPage<AppName.Models.MyViewModel> 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Txt.Text = Model.Title; 
    } 
} 

はナンセンスの背後にあるコードを避けるために、

<%@ Page 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<AppName.Models.MyViewModel>" 
%> 

<script runat="server"> 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Txt.Text = Model.Title; 
    } 
</script> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    Home Page 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
    <asp:Label ID="Txt" runat="server" /> 
</asp:Content> 

ASP.NET MVC 3とRazorビューエンジンにいつか移行する予定がある場合は、このようなことはお勧めしません。

+0

うわー、それは醜い/狡猾です:)あなたの助けを大変ありがとう...私はこれをもう一度試してみます。 – NeilD

0

少し清潔な解決策が見つかりました。私の好きなものではありませんが、この厄介な問題の手を洗うには十分です。代わりに、内の使用(あなたがループしている場合、各反復のために)ViewBagに割り当て、そして世界的にそれを使用するユーザーコントロールにオブジェクトを渡すの

<% ViewBag.Item = item; %> 

<gc:Ribbon runat="server"> 
    <Content> 
     <strong><%= ViewBag.Item.DataItem.Name %></strong> 
    </Content> 
</gc:Ribbon> 

。メモリが私の右に役立つ場合、私はMVC 2が動的ViewBagの代わりにViewData ["loosely typed name"]を使うと信じています。