Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di EnSa
    Registrato dal
    Apr 2009
    Messaggi
    191

    [ASP.NET MVC3 EF] Compilare codice Razor da codice

    Ho una stringa salvata nel database esempio:

    codice:
    <div id=\"test\">@Html.Action(\"Index", \"Home\")</div>

    Come posso fare per fare in modo che quando richiamo la stringa da controller mi venga riconosciuta la parte @Html.Action("Index", "Home") come codice Razor e mi esegua lo stesso???

    Grazie mille

  2. #2
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    Non credo. In ogni caso nel momento in cui memorizzi la stringa poiche sai quale action e controller devi utilizzare per renderizzare il tag "a" puoi fare cosi dal controller (quello che crea e memorizza la stringa nel db non quello che richiama la view di presentazione)

    codice:
    TuaClasse.StringaHtml = string.Format("<div id=\"test\">{0}</div>",Url.Action("Index","Home"));
    la stringa viene memorizzata nel db con il tag a gia renderizzato. Quando la devi visualizzare devi preoccuparti solo di tirarla fuori nel punto in cui serve (con l'helper raw):

    codice:
    @Html.Raw(Model.StringaHtml)

  3. #3
    Utente di HTML.it L'avatar di EnSa
    Registrato dal
    Apr 2009
    Messaggi
    191
    però sorge un altro problema ...

    nella stringa che recupero dal database potrei avere anche più di un codice razor da eseguire senza conoscerne l'ordine con cui vengono inseriti ...


    esiste un'escamotage per risolvere il problema o mi consigli un altro metodo di approccio???


    grazie mille

  4. #4
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    Io credo che nel momento in cui da dentro un controller memorizzi la stringa html se non hai problemi ad inserire la sintassi razor nella stringa allora non hai problemi nemmeno ad inserire il risultato string dell'helper method, quelo di su era solo un esempio. Il "come" è esattamente uguale a come ci metti dentro razor: concatenazione di stringhe, uno stringbuilder dentro un ciclo , uno string format ecc.

    Se invece (come credo che tu stia facendo) dal backend, stai permettendo a chi riempie quel campo, di scrivere direttamente html e sintassi razor mischiate, allora lascia perdere razor tanto vale ci fai mettere l'html già renderizzato. Infatti se fosse possibile sarebbe poco sicuro, molto prono ad errori.
    in fondo razor è solo una sintassi che ti consente di scrivere agevolmente in visual studio codice c# fatto per lo piu da helper methods che renderizzano codice html in modo pulito cosi da non avere il cosiddetto effetto "spaghetti code".

    La mia opinione; poi magari se metti un esempio piu concreto capisco il motivo per cui dovrebbe essere necessaria questa strada o se c'è modo di fare diversamente.

  5. #5
    Utente di HTML.it L'avatar di EnSa
    Registrato dal
    Apr 2009
    Messaggi
    191
    Originariamente inviato da rsdpzed
    Non credo. In ogni caso nel momento in cui memorizzi la stringa poiche sai quale action e controller devi utilizzare per renderizzare il tag "a" puoi fare cosi dal controller (quello che crea e memorizza la stringa nel db non quello che richiama la view di presentazione)

    codice:
    TuaClasse.StringaHtml = string.Format("<div id=\"test\">{0}</div>",Url.Action("Index","Home"));
    la stringa viene memorizzata nel db con il tag a gia renderizzato. Quando la devi visualizzare devi preoccuparti solo di tirarla fuori nel punto in cui serve (con l'helper raw):

    codice:
    @Html.Raw(Model.StringaHtml)

    Il codice mi serve per gestire i templates da database ...

    In pratica salvo la pagina layout nel database e vorrei richiamarla da view sostituendo i codici razor con i corrispettivi codici ...


    ora utilizzo la logica

    {0} = Header
    {1} = Menu

    ecc

    mentre come faccio per dirgli che a {10} deve corrispondere @RenderBody???


    Grazie mille per l'aiuto

  6. #6
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    Ci sono due casi:

    1-Devi gestire diversi template per lo stesso sito, tutto quello che ti serve è decidere quale file di layout deve essere usato come "pagina master". La cosa puo essere facilmente gestibile in _Viewstart.cshtml (che è stato fatto apposta per questo). Carichi il nome del file di layout dal db (o come nell'esempio che segue dal web.config, non ha importanza in fondo) e lo usi come layout.
    codice:
    @using System.Configuration;
    @{
        string template = ConfigurationManager.AppSettings["Template"].ToString();
        Layout = template;
    }
    Se (caso estremo) vuoi creare il template dinamicamente dalla tua applicazione non puoi memorizzare la sintassi razor nel db e richiamarla ma devi passare comunque per la creazione del file di layout, memorizzare nel db il percorso di questo file e caricarlo come sopra.

    2-hai due (o piu) layout diversi in base alle action (per esempio io generalmente ho un layout per il sito e uno diverso per il backend) e vuoi decidere action per action quale layout utilizzare. La scelta non puoi piu farla nel _ViewStart (tropo tardi) ma nella action stessa. Esistono diverse soluzioni poco eleganti (come rinunciare al _ViewStart, o passare ogni volta il nome del file di layout al metodo View) oppure usi questa actionfilter (che ho scopiazzato da internet, che uso e che è molto comoda) che non fa altro che passare alla view il layout specificato come attribbuto.
    codice:
    public class LayoutInjecterAttribute : ActionFilterAttribute
    {
        private readonly string _masterName;
        public LayoutInjecterAttribute(string masterName)
        {
            _masterName = masterName;
        }
    
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
            var result = filterContext.Result as ViewResult;
            if (result != null)
            {
                result.MasterName = _masterName;
            }
        }
    }
    e la usi cosi

    codice:
    [LayoutInjecter("_Layout")]
    public ActionResult Index()
    {
        return View();
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.