2011-12-08 12 views
6

Jeśli mam wartość wewnątrz Dynamic ViewBag, dlaczego nie mogę przekazać go do metody? Tak więc dla uproszczenia, powiedzmy, mam ViewBag.SomeValue i chcę przekazać ViewBag.SomeValue do Pomocnika HTML. Jeśli pomocnik HTML akceptuje dynamiczny jako zmienną, dlaczego nie zaakceptuje mojego ViewBag.SomeValue?Przepuścić ViewBag jako 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

Czy możesz pokazać kod? Używam dynamicznego w szablonie aspx i pomocników, wygląda na to, że nie ma z tym problemu. –

+0

Właśnie edytowałem swoją odpowiedź i dodałem kod. – TYRONEMICHAEL

Odpowiedz

8

jako komunikat o błędzie informuje, że metod rozszerzeń nie można dynamicznie wywoływać. To nie jest obsługiwane w .NET. Nie ma to nic wspólnego z ASP.NET MVC ani Razor. Spróbuj napisać metodę rozszerzenia do jakiegoś typu, który pobiera dynamiczny argument, a następnie spróbuj wywołać tę metodę rozszerzenia, przekazując mu zmienną dynamiczną, a otrzymasz błąd czasu kompilacji.

Rozważmy następujący przykład aplikacji konsoli, który ilustruje to:

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

Więc trzeba obsada:

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

Rzeczywiście, jak powiedział Adam trzeba użyć silnie typami widoku modelu i nigdy nie używaj ViewBag. To tylko jeden z milionów powodów, dla których nie należy używać ViewBag.

+0

Dziękuję. Nadal trzeba dowiedzieć się więcej o dynamice w języku C#. – TYRONEMICHAEL

+0

Nadal można ref za pośrednictwem helper.ViewContext.Controller.ViewBag Chociaż nie? –

+0

Nie, dostęp za pomocą helpera return (string) .ViewData ["Title"]; – Ted

3

ważniejsze od ViewBag jest trochę złych praktyk do wykorzystania ze względu na magiczne właściwości ciągów jak na viewbag - co ty próbujesz wysłać do niego. Może jest lepszy sposób? Powinieneś być w stanie korzystać z instancji pomocnika odwoływać poprzez:

helper.ViewContext.Controller.ViewBag

ale nie jestem jedną za korzystanie ViewBag chyba tylko dla tytułu http://completedevelopment.blogspot.com/2011/12/stop-using-viewbag-in-most-places.html

+0

Wolę używać silnie typowanych modeli i przekazywać model do pomocnika. Ale powiedzmy na przykład, że chcesz przekazać tytuł, w tym przypadku ViewBag.SomeValue, do pomocnika html. Teraz możesz zadeklarować ciąg znaków i uczynić go równym Viewbag, a następnie przekazać ciąg do pomocnika. Ale to sprawia, że ​​znaczniki są bardziej nieuporządkowane. Zmieniłem powyższy kod, aby pokazać więcej tego, co próbuję osiągnąć. – TYRONEMICHAEL

+0

Byłem prawie pewny, że moja odpowiedź powyżej zapewnia poprawkę w konkretnym przypadku, jeśli zdecydujesz się to zrobić w ten sposób. –

+0

+1 - po przeczytaniu tego zdałem sobie sprawę, że mam zamiar zrobić coś głupiego. Uratowałeś mnie :) – Matt

0

Wiem, że jest to starsze pytanie, ale właśnie wyszedłem, gdy szukałem tego problemu.

Łatwo przekazać ViewBag jako parametr, po prostu wymieniając go jako dynamiczny w metodzie. Na przykład tutaj, w jaki sposób przekazuję ViewBag do jednej z moich klas pomocniczych do sortowania kolumn.

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