Передайте ViewBag как параметр - PullRequest
6 голосов
/ 08 декабря 2011

Если у меня есть значение внутри Dynamic ViewBag, почему я не могу передать его методу? Для простоты, скажем, у меня есть ViewBag.SomeValue, и я хочу передать ViewBag.SomeValue помощнику HTML. Если помощник HTML принимает динамический как переменную, почему он не принимает мой ViewBag.SomeValue?

@Html.SimpleHelper(ViewBag.SomeValue)

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

Ответы [ 3 ]

8 голосов
/ 08 декабря 2011

Как говорится в сообщении об ошибке, методы расширения не могут быть динамически отправлены. Это просто не поддерживается в .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 не следует использовать.

3 голосов
/ 08 декабря 2011

Еще важнее то, что ViewBag - это плохая практика, потому что в качестве свойств в viewbag используются магические строки - что вы пытаетесь отправить на него.Может быть, есть лучший способ?Вы должны иметь возможность использовать экземпляр помощника, чтобы ссылаться на него через:

helper.ViewContext.Controller.ViewBag

, но я не один для использования ViewBag, за исключением только для Title http://completedevelopment.blogspot.com/2011/12/stop-using-viewbag-in-most-places.html

0 голосов
/ 24 июня 2016

Я знаю, что это старый вопрос, но это то, что пришло мне в голову, когда я искал эту проблему.

Достаточно просто передать ViewBag в качестве параметра, просто перечислив его как динамический в методе. Например, вот как я передаю ViewBag в один из моих вспомогательных классов для сортировки столбцов.

public static IEnumerable<Models.MyViewModel> MyMethod(IEnumerable<Models.MyViewModel> model, string sortOrder, dynamic ViewBag)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...