以编程方式将Html注入视图

时间:2010-05-23 07:36:12

标签: asp.net asp.net-mvc

我有一个棘手的问题,我不确定在视图渲染过程中的哪个位置尝试这个。我正在MVC中构建一个简单的博客/ CMS,如果用户以管理员身份登录(因此具有编辑权限),我想在页面中注入一些html(最好是部分视图)。

我显然可以将渲染部分添加到母版页等。但在我的系统中,母版页/视图是CMS的“模板”,因此不应包含CMS特定的< %%>标记。我想挂钩渲染过程的某些部分并自己注入html。

有没有人知道如何在MVC中执行此操作?哪个是最好的点,ViewPage,ViewEngine?

谢谢,

伊恩

2 个答案:

答案 0 :(得分:1)

您可以使用Html.RenderPartial在页面中的某处插入HTML片段。如果要将其插入视图不可用的位置,但只能在主控制器上插入,则可以在主控制器中放置<asp:ContentPlaceHolder ID="Admin" runat="server" />占位符,并在视图中简单地覆盖它并插入部分。如果放置这样的占位符是不可接受的,你可以使用AJAX,如:$('#adminHolder').load('/home/admin');,但我可能会采用之前的方法,因为它可以在用户禁用javascript的情况下使用。

答案 1 :(得分:0)

好的,这有点乱,结果有点hacky。但它的确有效,而且这一切都很重要....

    protected override void Render(System.Web.UI.HtmlTextWriter writer)
    {
        if (!User.Identity.IsAuthenticated || !User.IsInRole("Admin"))
        {
            // If not admin continue as normal
            base.Render(writer);
            return;
        }

        // Taking a leaf out of the move viewstate to the bottom of page playbook
        var stringWriter = new System.IO.StringWriter();
        var htmlWriter = new HtmlTextWriter(stringWriter);
        base.Render(htmlWriter);
        var html = stringWriter.ToString();
        var endOfBody = html.IndexOf("</body>") - 1;
        if (endOfBody >= 0)
        {
            var adminConsole = Html.RenderPartialAsString("AdminPanel");
            html = html.Insert(endOfBody, adminConsole);
        }
        writer.Write(html);
    }

我实现自己的ViewPage覆盖Render方法。这将检查用户是否以管理员身份登录,如果是,则会在页面底部呈现部分内容。非常类似于webforms中的旧skool viewstate hacks。

享受。