我有一个简单的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项目。
谢谢! 尼尔
答案 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。