2011-12-08 51 views
6

如果我在Dynamic ViewBag中有一個值,爲什麼我不能將它傳遞給方法?所以爲了簡單起見,可以說我有ViewBag.SomeValue,我想將ViewBag.SomeValue傳遞給HTML助手。如果HTML助手接受動態作爲變量,爲什麼不接受我的ViewBag.SomeValue將ViewBag作爲參數傳遞

@Html.SimpleHelper(ViewBag.SomeValue) 

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

你能顯示一些代碼嗎?我在aspx模板和助手中使用動態,看起來沒有問題。 –

+0

我剛編輯我的答案並添加了代碼。 – TYRONEMICHAEL

回答

8

由於錯誤消息告訴你,擴展方法不能動態分派。它僅僅在.NET中不受支持。它與ASP.NET MVC或Razor無關。嘗試將擴展方法寫入某種需要動態參數的類型,然後嘗試調用此擴展方法將其傳遞給一個動態變量,並且您將收到編譯時錯誤。

考慮其說明了這以下的控制檯應用程序例如:

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

所以你需要轉換:

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

其實,亞當說,你需要使用強類型的視圖模型和從不使用ViewBag。這只是爲什麼不應該使用ViewBag的數百萬個原因之一。

+0

謝謝。仍然需要在C#中學習更多關於動態的知識。 – TYRONEMICHAEL

+0

您仍然可以通過helper.ViewContext.Controller進行引用。ViewBag 雖然沒有? –

+0

不,通過返回訪問(string)helper.ViewData [「Title」]; – Ted

3

更重要的是,因爲ViewBag是有點不好的做法是使用魔法,因爲字符串作爲viewbag性質的 - 什麼是你想給它。也許有更好的方法?您應該能夠使用助手的實例通過引用它:

helper.ViewContext.Controller.ViewBag

,但我不是一個使用ViewBag除了只爲標題 http://completedevelopment.blogspot.com/2011/12/stop-using-viewbag-in-most-places.html

+0

我更喜歡使用強類型模型並將模型傳遞給幫助器。但讓我們說,例如,您想將標題(本例中爲ViewBag.SomeValue)傳遞給html助手。現在你可以聲明一個字符串並且使它與Viewbag相同,然後將該字符串傳遞給幫助器。但這隻會讓標記變得更加混亂。我已經編輯了上面的代碼,向您展示了我想要實現的更多內容。 – TYRONEMICHAEL

+0

我很確定我的回答如上所述,以便在您的具體情況下提供解決方案,如果您選擇這樣做。 –

+0

+1 - 讀完這個之後,我意識到我正要做些愚蠢的事情。你救了我:) – Matt

0

我知道這是一個較老的問題,但是當我搜索這個問題時,它就是我想到的。

通過將ViewBag作爲參數簡單地列爲方法中的動態參數,很容易將ViewBag作爲參數傳遞。例如,這裏是我如何將ViewBag傳遞給我的一個幫助器類來進行列排序。

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