我需要从页面模板中的PageHandler Header Controls集合中删除一个对象。
我可以使用下面的脚本在小部件视图级别执行此操作,但是此时尚未添加我需要删除的脚本,因此我需要在消耗之前将其移动。
我能找到的唯一可访问的地方是我的模板文件 - 就在@Html.Section("head")
之前。我正在尝试仅删除此模板的默认规范URL(在此站点中发生一些疯狂的路由...不要问)。
var pageHandler = this.ViewContext.HttpContext.Handler.GetPageHandler();
foreach (var c in pageHandler.Header.Controls)
{
if (c != null && c is System.Web.UI.HtmlControls.HtmlLink)
{
System.Web.UI.HtmlControls.HtmlLink mylink = (System.Web.UI.HtmlControls.HtmlLink)c;
if (mylink.Attributes["rel"] == "canonical")
{
pageHandler.Header.Controls.Remove(mylink);
}
}
}
当我尝试在<head>
标记pageHandler.Header
内的模板文件中使用它时为空。
1 - 我是否以错误的方式访问此对象以用于此特定模板级别?如果是这样,那么适当的对象引用是什么?
2 - 由于Sitefinity中的一些幕后构建顺序,它还没有设置好吗?如果是这样,我可以/应该在哪里处理这个对象?
3 - 还有其他事情发生了吗?
我没有问如何修复空参考例外
我知道该对象为null,并且我试图在此级别找到Sitefinity视图模型中可能找到的数据。
答案 0 :(得分:1)
规范网址在Page_PreRenderComplete事件中设置,该事件在视图中的代码执行后触发。
我要做的是创建一个新的小部件,例如CanonicalUrlRemover。
在其Index方法中,找到Page对象并订阅其PreRenderComplete事件。然后在事件处理程序中删除规范URL。
public ActionResult Index()
{
var page = HttpContext.CurrentHandler.GetPageHandler();
page.PreRenderComplete += Page_PreRenderComplete;
return new EmptyResult();
}
private void Page_PreRenderComplete(object sender, System.EventArgs e)
{
var page = sender as System.Web.UI.Page;
if (page != null)
{
var headerControls = page.Header.Controls;
foreach (var c in headerControls)
{
if (c != null && c is System.Web.UI.HtmlControls.HtmlLink)
{
System.Web.UI.HtmlControls.HtmlLink mylink = (System.Web.UI.HtmlControls.HtmlLink)c;
if (mylink.Attributes["rel"] == "canonical")
{
headerControls.Remove(mylink);
}
}
}
}
}
只需将小部件放在此特定页面模板中,您就可以了。