MVC 模板级别的访问控制集合 Sitefinity
Access Controls collection at MVC template level Sitefinity
我需要从页面模板的 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 中的一些幕后页面构建顺序而尚未设置?如果是这样,could/should 我在哪里处理访问这个对象?
3 - 是否发生了其他事情?
我不是在问如何修复空引用异常
我知道该对象为空,我正在尝试在该级别的 Sitefinity 视图模型中找到此数据的位置。
规范 url 在 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);
}
}
}
}
}
只需将小部件放入此特定页面模板中即可。
我需要从页面模板的 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 中的一些幕后页面构建顺序而尚未设置?如果是这样,could/should 我在哪里处理访问这个对象?
3 - 是否发生了其他事情?
我不是在问如何修复空引用异常
我知道该对象为空,我正在尝试在该级别的 Sitefinity 视图模型中找到此数据的位置。
规范 url 在 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);
}
}
}
}
}
只需将小部件放入此特定页面模板中即可。