0

我有一个使用 TagPrefix / TagName 注册在 .NET MVC 页面上呈现的用户控件。调用它的属性指定在服务器上运行,并指定用户控件的 .ascx 代码用作变量的几个变量值

例如

<%@ Register TagPrefix="UC" TagName="MyUserControl" Src="MyUserControlPathAndName.ascx" %>
. . .
<UC:MyUserControl runat="server" ID="MyID" ID2="MyID2" />

然后在用户控件的 .ascx 中,有 HTML、脚本和使用 ID 和 ID2 变量的代码。

我想要做的是不将此标记编码到 .ascx 文件中,而是保持我的观点非常简单 - 只需调用 Html Helper,并在 HtmlHelper 代码中处理此用户控件的使用,但我'我有点不知所措 - 有没有办法在 HTML 助手内部呈现标签,然后当 HTML 助手生成的字符串被呈现时,这些标签仍然会在服务器端得到处理?或者,如果没有,那么有没有办法在运行我的 HTML Helper 时从代码中渲染用户控件(包括将它需要的 ID 和 ID2 变量传递给它)?

这里这里建议的调用 ViewPage.RenderControl 或 Page.RenderControl 的方法确实有效,但我不知道如何传入 ID 和 ID2 变量。我试过这个

viewPage.ViewData = new ViewDataDictionary();
viewPage.ViewData.Add("ID", "MyID");
viewPage.ViewData.Add("ID2", "MyID2");

但是,UserControl 的 .ascx 中使用代码隐藏文件中的 ID2 属性的代码没有看到该值(可能是因为它不应该是 ViewData 中的值,而是在 UserControl 类本身上设置的值)。试图弄清楚如何在 UserControl 上设置该属性。

我想我可能在这里找到了答案。还在验证。如果有效,将其作为答案发布。

4

1 回答 1

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();
于 2019-07-19T22:42:31.440 回答