2011-08-31 15 views
5

Supponiamo di avere una certa azione nel controllore:Come aggiungere HTML personalizzato alla fine della visualizzazione con attributi in ASP.NET MVC?

public ActionResult SomeAction() 
{ 
    return View(); 
} 

voglio avere la possibilità di aggiungere un po 'di codice HTML alla fine del codice HTML di visualizzazione dei risultati con l'aiuto di attributi, ad esempio:

[SomeHTML] 
public ActionResult SomeAction() 
{ 
    return View(); 
} 

dove

public class SomeHTMLAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var response = filterContext.HttpContext.Response; 

     if (response.ContentType == "text/html") 
     { 
      response.Write("someHTML"); 
     } 
    } 
} 

Filtri (ActionFilterAttribute) permettono di aggiungere un po 'di codice HTML per la parte superiore o inferiore della pagina web, ma non alla fine del codice HTML di vista.

Come archiviare questo?

risposta

12

è possibile utilizzare un filtro di risposta:

public class SomeHTMLAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.HttpContext.Response.Filter = new SomeHTMLFilter(filterContext.HttpContext.Response.Filter); 
     base.OnActionExecuting(filterContext); 
    } 
} 

public class SomeHTMLFilter : MemoryStream 
{ 
    private readonly Stream _outputStream; 
    public SomeHTMLFilter(Stream outputStream) 
    { 
     _outputStream = outputStream; 
    } 

    public override void Write(byte[] buffer, int offset, int count) 
    { 
     _outputStream.Write(buffer, 0, buffer.Length); 
    } 

    public override void Close() 
    { 
     var buffer = Encoding.UTF8.GetBytes("Hello World"); 
     _outputStream.Write(buffer, 0, buffer.Length); 
     base.Close(); 
    } 
} 
+0

Darin, che in realtà lo scrive alla fine del corpo, ma non alla fine della vista – gsharp

+0

linea '_outputStream.Write (buffer, 0, tampone. Length); 'in' Write', il metodo override dovrebbe dire '_outputStream.Write (buffer, offset, count);' altrimenti si ottiene HTML mutilato – mdonatas

Problemi correlati