2011-03-15 22 views
0

我有一個簡單的ASCX用戶控件(非MVC)。用戶控件有一個屬性(我們稱它爲Title或其他)。從標準ASCX用戶控件訪問MVC模型

我也有一個包含用戶控件的MVC局部視圖。

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

我想什麼,能夠做的就是這樣的事情:

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

......這樣我就可以訪問自己的內部模型的某些屬性。 不幸的是,這種方法不起作用,因爲我收到一條消息:「這不是scriptlet,會以純文本形式輸出」。

我試圖做甚至可能嗎?如果是這樣,有沒有人有任何想法,我可以嘗試做到這一點?

如果相關,這是一個帶有MVC 2組件的.Net 4項目。

謝謝! Neil

回答

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 ......,我會嘔吐):

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.Item = item; %> 

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

不是傳遞對象到用戶控件中使用,將其分配給ViewBag(每個迭代,如果你循環),並在全球使用它的。如果內存爲我服務,我相信MVC 2使用ViewData [「鬆散類型名稱」]而不是動態ViewBag。