2011-12-08 5 views
6

Dynamic ViewBagの中に値がある場合、なぜそれをメソッドに渡すことができないのですか?したがって、わかりやすくするために、ViewBag.SomeValueがあり、ViewBag.SomeValueをHTMLヘルパーに渡したいとします。 HTMLヘルパーがdynamicを変数として受け入れる場合、なぜそれが私のViewBag.SomeValueを受け入れないのですか?さらに重要なViewBagがviewbagのプロパティとしてので、魔法の文字列の使用に悪い習慣を多少あるので、パラメタとして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

以外ViewBagを使用するためのものではないよ:あなたは経由して、それを参照するためにヘルパーのインスタンスを使用することができるはずですエラーメッセージは、拡張メソッドを動的にディスパッチすることはできません。 .NETではサポートされていません。 ASP.NET MVCやRazorとは何の関係もありません。動的な引数を取る型に拡張メソッドを書いてみて、動的な変数を渡すこの拡張メソッドを呼び出すと、コンパイル時のエラーが出ます。

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

実際、アダムは、あなたが強く型付けされたビューモデルを使用する必要があると言ったように:

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

だからあなたはキャストする必要があります。

はこれを示し、次のコンソールアプリケーションの例を考えてみましょうViewBagを使用しないでください。これは、ViewBagを使用しない何百万もの理由の1つに過ぎません。

+0

ありがとうございます。 C#でダイナミックについてもっと知る必要があります。 – TYRONEMICHAEL

+0

あなたはまだhelper.ViewContext.Controllerを使ってそれを参照できます。ViewBag いいえ? –

+0

いいえ、return(string)を使用したアクセスhelper.ViewData ["Title"]; – Ted

3

- あなたがそれに送信しようとしています。たぶん良い方法がありますか?

helper.ViewContext.Controller.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を列ソート用のヘルパークラスの1つに渡す方法を示します。

public static IEnumerable<Models.MyViewModel> MyMethod(IEnumerable<Models.MyViewModel> model, string sortOrder, dynamic ViewBag) 
関連する問題