从标准ASCX UserControl访问MVC模型

时间:2011-03-15 13:37:31

标签: asp.net asp.net-mvc user-controls

我有一个简单的ASCX用户控件(非MVC)。用户控件上有一个属性(让我们称之为标题或其他东西)。

我还有一个包含用户控件的MVC Partial View。

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

...这样我就可以在Control中访问模型的某些属性。 不幸的是,这个方法不起作用,因为我收到一条消息“这不是scriptlet。将输出为纯文本”。

我正在尝试做甚么可能吗?如果是这样,有没有人有任何想法我可以尝试做到这一点?

如果相关,这是一个带有MVC 2组件的.Net 4项目。

谢谢! 尼尔

2 个答案:

答案 0 :(得分: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视图引擎,我建议您不要这样做。

答案 1 :(得分:0)

我找到了一个更清洁的解决方案。仍然不是我喜欢的,但足以让我洗手这个讨厌的问题。

<% ViewBag.Item = item; %>

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

不是将对象传递给用户控件以在其中使用,而是将其分配给ViewBag(如果您正在循环,则为每次迭代),并将其全局使用。如果内存对我有用,我相信MVC 2使用ViewData [“松散类型名称”]而不是动态ViewBag。