目的を達成するための 1 つのアイデアは、グローバル アクション フィルターを使用することです。これにより、アクションの結果が取得され、ブラウザに送り返される前に変更できるようになります。この手法を使用して CSS クラスをページの body タグに追加しましたが、アプリケーションでも機能すると思います。
これが私が使用したコードです(基本に要約されています):
public class GlobalCssClassFilter : ActionFilterAttribute {
public override void OnActionExecuting(ActionExecutingContext filterContext) {
//build the data you need for the filter here and put it into the filterContext
//ex: filterContext.HttpContext.Items.Add("key", "value");
//activate the filter, passing the HtppContext we will need in the filter.
filterContext.HttpContext.Response.Filter = new GlobalCssStream(filterContext.HttpContext);
}
}
public class GlobalCssStream : MemoryStream {
//to store the context for retrieving the area, controller, and action
private readonly HttpContextBase _context;
//to store the response for the Write override
private readonly Stream _response;
public GlobalCssStream(HttpContextBase context) {
_context = context;
_response = context.Response.Filter;
}
public override void Write(byte[] buffer, int offset, int count) {
//get the text of the page being output
var html = Encoding.UTF8.GetString(buffer);
//get the data from the context
//ex var area = _context.Items["key"] == null ? "" : _context.Items["key"].ToString();
//find your tags and add the new ones here
//modify the 'html' variable to accomplish this
//put the modified page back to the response.
buffer = Encoding.UTF8.GetBytes(html);
_response.Write(buffer, offset, buffer.Length);
}
}
注意すべきことの 1 つは、HTML が 8K のチャンクにバッファリングされることです。そのため、そのサイズを超えるページがある場合は、それを処理する方法を決定する必要があるかもしれません。私のアプリケーションでは、それに対処する必要はありませんでした。
また、すべてがこのフィルターを介して送信されるため、行っている変更が JSON の結果などに影響を与えないようにする必要があります。