2011-12-08 16 views
6

Se ho un valore all'interno della Dynamic ViewBag, perché non posso passarlo a un metodo? Quindi, per motivi di semplicità, diciamo che ho ViewBag.SomeValue e voglio passare lo ViewBag.SomeValue a un helper HTML. Se l'helper HTML accetta dinamica come variabile, perché non accetterà il mio ViewBag.SomeValue?Passare il ViewBag come Paramerter

@Html.SimpleHelper(ViewBag.SomeValue) 

public static string SimpleHelper(this HtmlHelper html, dynamic dynamicString) 
{ 
    return string.Format("This is my dynamic string: {0}", dynamicString); 
} 
+0

Puoi mostrare un po 'di codice? Sto usando dinamico in template aspx e aiutanti, sembra che non ci sia alcun problema. –

+0

Ho appena modificato la mia risposta e aggiunto il codice. – TYRONEMICHAEL

risposta

8

Come il messaggio di errore indica che i metodi di estensione non possono essere inviati dinamicamente. Non è supportato in .NET. Non ha nulla a che fare con ASP.NET MVC o Razor. Prova a scrivere un metodo di estensione per un certo tipo che accetta un argomento dinamico e poi prova a richiamare questo metodo di estensione passandogli una variabile dinamica e otterrai un errore in fase di compilazione.

Si consideri il seguente esempio di applicazione di console che illustra questo:

public static class Extensions 
{ 
    public static void Foo(this object o, dynamic x) 
    { 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
     dynamic x = "abc"; 
     new object().Foo(x); // Compile time error here 
    } 
} 

quindi è necessario lanciare:

@Html.SimpleHelper((string)ViewBag.SomeValue) 

In realtà, come Adam ha detto è necessario utilizzare il modello vista fortemente tipizzato e mai usare ViewBag. È solo uno dei milioni di motivi per cui ViewBag non deve essere utilizzato.

+0

Grazie. Ancora bisogno di saperne di più sulla dinamica in C#. – TYRONEMICHAEL

+0

È ancora possibile rifarlo tramite helper.ViewContext.Controller.ViewBag Anche se no? –

+0

No, accesso tramite helper return (stringa). ViewData ["Title"]; – Ted

3

Ancora più importante dal momento che ViewBag è un po 'di una cattiva pratica da usare a causa della corde magiche come immobili in viewbag - che cosa stai cercando di inviare ad esso. Forse c'è un modo migliore? Si dovrebbe essere in grado di utilizzare l'istanza di supporto per fare riferimento a esso tramite:

helper.ViewContext.Controller.ViewBag

ma io non sono uno per l'utilizzo di ViewBag eccezione solo per Titolo http://completedevelopment.blogspot.com/2011/12/stop-using-viewbag-in-most-places.html

+0

Preferisco usare modelli fortemente tipizzati e passare il modello nell'assistente. Ma diciamo per esempio che volevi passare il titolo, in questo caso un ViewBag.SomeValue, in un helper html. Ora puoi dichiarare una stringa e renderla uguale al Viewbag e quindi passare la stringa nell'helper. Ma questo rende il markup molto più disordinato. Ho modificato il mio codice qui sopra per mostrarti di più di ciò che sto cercando di ottenere. – TYRONEMICHAEL

+0

Ero abbastanza sicuro della mia risposta sopra per fornire una soluzione nel caso specifico se si sceglie di farlo in quel modo. –

+0

+1 - dopo aver letto questo ho capito che stavo per fare qualcosa di stupido. Mi hai salvato :) – Matt

0

So che questa è una domanda più vecchia ma è quello che mi è venuto in mente quando ho cercato questo problema.

È abbastanza facile passare ViewBag come parametro semplicemente elencandolo come una dinamica nel metodo. Ad esempio, ecco come passare il ViewBag in una delle mie classi di helper per l'ordinamento delle colonne.

public static IEnumerable<Models.MyViewModel> MyMethod(IEnumerable<Models.MyViewModel> model, string sortOrder, dynamic ViewBag)