Есть ли способ перехватить жизненный цикл страницы с контроллера MVC и ввести код где-нибудь на странице или DOM? Я хотел бы добавить HTML, CSS и JavaScript в верхний и нижний колонтитулы страницы, но не добавляя их в представление _Layout, которое где-то внедрено в сборку. Я бы хотел сделать это с контроллера Global.asax/Application_Start. Это возможно?Внедрить HTML или скрипты в жизненный цикл страницы MVC?
ответ
Я сделал что-то похожее на это.
Во-первых, вам нужно добавить заполнитель внутри файлов макета (где вы хотите, чтобы ввести код)
Во-вторых, вам нужно добавить глобальный ActionFilterAttribute в вашем global.asax. В FilterAttribute переопределить фильтр только с помощью OnActionExecuted и фильтровать только ViewResults.
В-третьих, вам необходимо изменить Response.Filter, с новым фильтром, который будет искать заполнители внутри html-кода и заменить его на свой собственный.
Я написал именно это, я добавил способ объявить стили & Скрипты в любом месте кода, и когда результат будет выполнен, ресурсы будут введены в главный тег.
public class DynamicHeaderHandler : ActionFilterAttribute
{
private static readonly byte[] _headClosingTagBuffer = Encoding.UTF8.GetBytes("</head>");
private static readonly byte[] _placeholderBuffer = Encoding.UTF8.GetBytes(DynamicHeader.SectionPlaceholder);
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.Result is ViewResult)
{
filterContext.HttpContext.Response.Filter = new ResponseFilter(filterContext.HttpContext.Response.Filter);
}
base.OnActionExecuted(filterContext);
}
private class ResponseFilter : MemoryStream
{
private readonly Stream _outputStream;
public ResponseFilter(Stream aOutputStream)
{
_outputStream = aOutputStream;
}
public override void Close()
{
_outputStream.Flush();
_outputStream.Close();
}
public override void Write(byte[] buffer, int offset, int count)
{
var maxIndex = IndexOfSubArray(buffer, _headClosingTagBuffer);
var index = IndexOfSubArray(buffer, _placeholderBuffer, maxIndex);
if (index == -1)
{
_outputStream.Write(buffer, offset, count);
}
else
{
var html = DynamicHeader.GetHtml();
var injectBytes = Encoding.UTF8.GetBytes(html);
var newBuffer = buffer.Take(index).Concat(injectBytes).Concat(buffer.Skip(index + _placeholderBuffer.Length)).ToArray();
_outputStream.Write(newBuffer, 0, newBuffer.Length);
}
}
private static int IndexOfSubArray(byte[] aBuffer, byte[] aSubBuffer, int aMaxIndex = int.MaxValue)
{
if (aBuffer.Length < aSubBuffer.Length)
{
return -1;
}
for (var outerIndex = 0; outerIndex < aBuffer.Length && outerIndex < aMaxIndex; ++outerIndex)
{
var isEqual = true;
for (int subInnerIndex = 0, innerIndex = outerIndex; subInnerIndex < aSubBuffer.Length && innerIndex < aBuffer.Length; ++subInnerIndex, ++innerIndex)
{
if (aBuffer[innerIndex] != aSubBuffer[subInnerIndex])
{
isEqual = false;
break;
}
}
if (isEqual)
{
return outerIndex;
}
}
return -1;
}
}
}
Я прикрепил ActionFilterAttribute, что, вероятно, относится к вам.
Если вы хотите увидеть весь код, вы можете посетить здесь: Add Styles & Scripts Dynamically
- 1. Жизненный цикл страницы MVC Asp.net
- 2. Жизненный цикл страницы
- 3. asp.net жизненный цикл страницы
- 4. asp.net жизненный цикл страницы
- 5. Жизненный цикл страницы ASP.net
- 6. жизненный цикл страницы в javascript
- 7. Жизненный цикл приложения ASP.NET - НЕВОЗМОЖНЫЙ жизненный цикл страницы
- 8. MVC4 и жизненный цикл страницы?
- 9. Жизненный цикл контроллера ASP.NET MVC
- 10. CKEditor жизненный цикл контента HTML: жерех чистый MVC случай
- 11. Сеанс ASP.NET и жизненный цикл страницы
- 12. События .NET Control и жизненный цикл страницы
- 13. Response.Redirect ("XXX", false) и жизненный цикл страницы?
- 14. AJAX postback и жизненный цикл страницы
- 15. ASP.NET MVC контроллер завод Жизненный цикл
- 16. Жизненный цикл страницы ASP.net с примерами
- 17. жизненный цикл страницы и текстовое поле
- 18. Жизненный цикл макета (или компонента) в Ваадине?
- 19. Жизненный цикл Джекила
- 20. Жизненный цикл события WinForms
- 21. Жизненный цикл в флаттере
- 22. Жизненный цикл в MvvmCross
- 23. Ионный жизненный цикл не срабатывает
- 24. Титан - жизненный цикл ti.app.proper
- 25. Жизненный цикл жизненного цикла ASP.NET
- 26. Жизненный цикл Spring + Hibernate
- 27. Жизненный цикл веб-приложений Azure
- 28. Жизненный цикл форм Qt (или Windows)
- 29. Жизненный цикл виджетов?
- 30. жизненный цикл QSharedPointer или станд :: shared_ptr
Что делать, если есть несколько вызовов писать, первый пишущие до ' he' и следующий, начиная с' объявления> '? В этом случае ваш код не обнаружит конца головы. Обычно куски, переданные в Write, должны быть больше, чем общий HTML-заголовок, но все же. Вероятно, вы должны буферизировать все входные данные и сравнить буферный ввод с закрывающим тегом буфера. Разумеется, после окончания головы вы можете писать все непосредственно в поток завернутого потока. –
Не думал об этом случае! Так или иначе, так как у меня никогда не было проблем, я думаю, мне повезло и не столкнулось с этим делом. Я исправлю это на моей стороне. Но это вам помогло? –