2011-12-08 20 views
6

Si tengo un valor dentro de Dynamic ViewBag, ¿por qué no puedo pasarlo a un método? Entonces, para simplificar, digamos que tengo ViewBag.SomeValue, y quiero pasar el ViewBag.SomeValue a un HTML Helper. Si el ayudante de HTML acepta dinámica como una variable, ¿por qué no aceptará mi ViewBag.SomeValue?Pase ViewBag como parámetro

@Html.SimpleHelper(ViewBag.SomeValue) 

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

¿Puede mostrar el código? Estoy usando dynamic en la plantilla aspx y ayudantes, parece que no hay problema para eso. –

+0

Acabo de editar mi respuesta y agregué el código. – TYRONEMICHAEL

Respuesta

8

A medida que la mensaje de error le dice que los métodos de extensión no se pueden distribuir dinámicamente. Simplemente no es compatible con .NET. No tiene nada que ver con ASP.NET MVC o Razor. Intente escribir un método de extensión para algún tipo que tome un argumento dinámico y luego intente invocar este método de extensión pasándole una variable dinámica y obtendrá un error de tiempo de compilación.

consideremos el siguiente ejemplo de aplicación de consola que ilustra esto:

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 
    } 
} 

Por lo tanto, es necesario especificar:

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

En realidad, como dijo Adam es necesario utilizar modelo de vista inflexible y nunca use ViewBag. Es solo una de las millones de razones por las cuales ViewBag no debe ser utilizado.

+0

Gracias. Aún necesita aprender más sobre la dinámica en C#. – TYRONEMICHAEL

+0

Aún puede refinarlo a través de helper.ViewContext.Controller.ViewBag ¿Aunque no? –

+0

No, acceda a través de return (cadena) helper.ViewData ["Título"]; – Ted

3

Aún más importante, ya ViewBag es algo así como una mala práctica de usar debido a las cuerdas mágicas como propiedades en viewbag - ¿qué estás tratando de enviar a la misma. Tal vez hay una mejor manera? Usted debe ser capaz de utilizar la instancia ayudante para hacer referencia a ella a través de:

helper.ViewContext.Controller.ViewBag

pero no soy uno para el uso ViewBag con la única excepción de Título http://completedevelopment.blogspot.com/2011/12/stop-using-viewbag-in-most-places.html

+0

Prefiero usar modelos muy tipados y pasar el modelo a la ayuda. Pero digamos, por ejemplo, que quería pasar el título, en este caso un ViewBag.SomeValue, a un helper html. Ahora puedes declarar una cadena y hacer que sea igual al Viewbag y luego pasar la cadena al helper. Pero eso hace que el marcado sea mucho más complicado. He editado mi código anterior para mostrarle más de lo que estoy tratando de lograr. – TYRONEMICHAEL

+0

Estaba bastante seguro de que mi respuesta anterior proporcionaba una solución en tu caso específico si así lo elegías. –

+0

+1 - después de leer esto me di cuenta de que estaba a punto de hacer algo estúpido. Me salvaste :) – Matt

0

Sé que esta es una pregunta anterior, pero es lo que surgió cuando busqué este problema.

Es bastante fácil pasar el ViewBag como parámetro simplemente al listarlo como una dinámica en el método. Por ejemplo, aquí es cómo paso el ViewBag en una de mis clases de ayuda para la clasificación de columnas.

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