我有一个棘手的问题,我不确定在视图渲染过程中的哪个位置尝试这个。我正在MVC中构建一个简单的博客/ CMS,如果用户以管理员身份登录(因此具有编辑权限),我想在页面中注入一些html(最好是部分视图)。
我显然可以将渲染部分添加到母版页等。但在我的系统中,母版页/视图是CMS的“模板”,因此不应包含CMS特定的< %%>标记。我想挂钩渲染过程的某些部分并自己注入html。
有没有人知道如何在MVC中执行此操作?哪个是最好的点,ViewPage,ViewEngine?
谢谢,
伊恩
答案 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。
享受。