Передать ViewData пользовательскому элементу управления MVC - PullRequest
1 голос
/ 16 декабря 2011

Это MVC 2

Это часть моего пользовательского элемента управления

Foo = <%= ViewData["Foo"] %>

<ul id="menu" class="topTabMenu">
    <% foreach (X.Site s in X.AllSites) { %>
    ...

И вот как я это называю:

<% Html.RenderPartial("MenuTabsPartial", Model, new ViewDataDictionary(new { Foo = "Bar" })); %>

Что мне нужно сделать, чтобы ViewData["Foo"] отобразил «Бар»? Есть ли лучший способ передать некоторые простые данные в эту часть?

Передача его в Модель не будет работать, поскольку я уже использую Модель для чего-то другого.

EDIT

Ручное присвоение этого значения TempData действительно работает. Должен ли я просто использовать TempData вместо этого? Можно ли установить ViewData только из контроллера?

Ответы [ 2 ]

1 голос
/ 16 декабря 2011

Я не уверен, что вы можете создать ViewDataDictionary с анонимным объектом. Попробуйте перегрузить, взяв другой ViewDataDictionary. Это должно заставить ваши ViewData ["foo"] отображать "Bar".

Html.RenderPartial("MenuTabsPartial", Model, new ViewDataDictionary(new ViewDataDictionary { { "Foo", "bar" } }));

Я делал это один или два раза, но я бы сказал, что вы действительно должны рассмотреть возможность передачи этого в Модель. Если ваша модель уже не является моделью view , то я бы порекомендовал сделать одну с двумя свойствами: одну, которая представляет собой «Model» в настоящее время, и другую для «Foo». Контроллер установит это и передаст его в представление.

class MyViewModel
{
    public TypeOfMainModel MainModel {get; set;} //put your current model here
    public string Foo {get; set;}
}

Пусть ваш вид использует это как модель вида. Затем, когда вы визуализируете свою часть, вы можете просто передать всю модель или, возможно, просто дать ей Foo (если вашему частичному виду нужна только строка):

Html.RenderPartial("MenuTabsPartial", Model.Foo);

Выбор за вами, но мой предпочтительный подход - создание контейнера модели представления, в котором содержится все необходимое для представления и любого частичного представления.

1 голос
/ 16 декабря 2011

Согласно документации Microsoft по ViewData , это:

Получает или задает словарь, содержащий данные для передачи между контроллер и вид.

Так что, исходя только из этого определения, я бы сказал, что вы правы, говоря, что ViewData можно установить только из контроллера. Если TempData работает для вас, я бы использовал это. Вы также можете попробовать ViewBag, если не боитесь динамики.

Редактировать: Игнорировать мой комментарий о ViewBag, я не видел, чтобы ваш вопрос был помечен с помощью MVC2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...