我有一个用户控件,它使用TagPrefix / TagName注册在.NET MVC页面上呈现。调用它的属性指定给runat服务器,并指定用户控件的.ascx代码用作变量的几个变量值
例如
<%@ Register TagPrefix="UC" TagName="MyUserControl" Src="MyUserControlPathAndName.ascx" %>
. . .
<UC:MyUserControl runat="server" ID="MyID" ID2="MyID2" />
然后,在用户控件的.ascx中,存在使用ID和ID2变量的HTML,脚本和代码。
我要做的是不要将此标记编码为.ascx文件,而是使我的视图非常简单-只需调用Html Helper,并在HtmlHelper代码中处理此用户控件的使用,但是我有点无所适从-在HTML帮助器中是否有一种方法可以呈现标记,当呈现HTML帮助器生成的字符串时,这些标记仍将在服务器端得到处理?或者,如果没有,那么是否有一种方法可以在运行HTML Helper时从代码中呈现用户控件(包括向其传递所需的ID和ID2变量)?
建议here和here的方法调用ViewPage.RenderControl或Page.RenderControl确实有效,但是我不知道如何传递ID和ID2变量。我尝试过了
viewPage.ViewData = new ViewDataDictionary();
viewPage.ViewData.Add("ID", "MyID");
viewPage.ViewData.Add("ID2", "MyID2");
但是,使用代码隐藏文件中ID2属性的UserControl .ascx中的代码看不到该值(大概是因为它不应该是ViewData中的值,而是在UserControl类本身上设置的值) 。试图弄清楚如何在UserControl上设置该属性。
我想我可能已经找到了答案here。仍在验证中。如果可行,将其发布为答案。
答案 0 :(得分:0)
使用在代码隐藏类上设置的变量将其呈现为字符串(我不必费心设置ID变量,因为该变量似乎没有在.ascx代码中使用,而只是在控件本身上设置了id ,但我认为可以将其设置为没有问题):
string controlName = "~/Views/MyUserControlPathAndName.ascx";
ViewPage viewPage = new ViewPage() { ViewContext = new ViewContext() };
Control c = viewPage.LoadControl(controlName);
MyControlType myControl = (MyControlType)c;
myControl.ID2 = "MyID2";
viewPage.Controls.Add(c);
StringBuilder sb = new StringBuilder();
using (StringWriter sw = new StringWriter(sb))
{
using (HtmlTextWriter tw = new HtmlTextWriter(sw))
{
viewPage.RenderControl(tw);
}
}
return sb.ToString();