layout dinamico; viewBag vs render azioni

2

Sono uno studente interno che lavora a un progetto. Abbiamo la necessità di utilizzare un layout dinamico. In origine tutto ciò di cui avevamo bisogno era sapere se un input di ricerca dovesse apparire o meno nella barra di navigazione e su quale catalogo si dovrebbe cercare. Ora ci sono più meta-informazioni necessarie per la ricerca e altre barre laterali visualizzate dinamicamente.

Tutte queste informazioni possono essere recuperate dai contesti disponibili in ogni richiesta di pagina, quindi stavo sovrascrivendo il metodo OnActionExecuted nei progetti baseController sembrava un po 'come questo.

    OnActionExecuted(ActionExecutedContext context)
    {
        var controllerName = context.ActionDescriptor.ControllerDescriptor.ControllerName
        this.ViewBag.Things = getStuff(controllerName);
        this.ViewBag.OtherThings = getMoreStuff(contollerName);
        //.... about 15 more ViewBag variables....
        base.OnActionExecuted(context);
    }

Ora nel mio layout e in qualsiasi altra pagina posso utilizzare tutte queste cose. il problema è che ViewBag sta diventando rapidamente gonfio, e sono sicuro che troveranno cose più dinamiche da inserire nel layout. Anche questo sembra promuovere un approccio un po 'ad-hoc con il quale non sono del tutto a mio agio.

Invece penso che mi sposterò a usare renderAction nel layout per queste parti dinamiche e rinunciare a gran parte delle proprietà ViewBag . C'è uno svantaggio principale nell'usare renderAction di cui non sono a conoscenza? Sono sopra l'ingegneria e va bene con l'approccio ViewBag heavy?

Ho provato a riprendere un layout così dinamico perché sembra una scelta di design bizzarra ma insistono per averlo, quindi sono curioso di approcciarmi ad una cosa del genere. Il mio attuale approccio funziona, ma sembra negativo per la manutenibilità e la crescita del sito.

    
posta Tenderdude 21.12.2016 - 20:34
fonte

1 risposta

1

Se ogni vista ha bisogno di dati comuni, crea una classe figlia di System.Web.Mvc.WebViewPage con le cose comuni per ogni pagina:

public abstract class BasePageView<T> : System.Web.Mvc.WebViewPage<T>
{
    // the common stuff goes here
}

E poi usalo nelle tue visualizzazioni del rasoio:

@inherits BasePageView<YourViewModel>

@this.CommonThing1.Foo()
    
risposta data 21.12.2016 - 22:53
fonte

Leggi altre domande sui tag