Asp.net MVC RC1 RenderPartial ViewDataDictionary

Я пытаюсь передать объект ViewData с главной страницы на пользовательский элемент управления с помощью ViewDataDictionary.

Проблема заключается в том, что ViewDataDictionary не возвращает никаких значений в пользовательском элементе управления, какой бы я ни пытался.

Пример кода ниже использует анонимный объект только для демонстрации, хотя ни этот метод, ни передача объекта ViewData не работают.

Ниже приведен вспомогательный метод RenderPartial, который я пытаюсь использовать:

<% Html.RenderPartial("/Views/Project/Projects.ascx", ViewData.Eval("Projects"), new ViewDataDictionary(new { Test = "Mark" })); %>

и, на мой взгляд, пользовательский элемент управления я делаю следующее:

<%= Html.Encode(ViewData["Test"]) %>

Почему это ничего не возвращает?

Спасибо за вашу помощь.

EDIT:

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

Ответ 1

Вы пробовали:

<% Html.RenderPartial("~/Views/Project/Projects.ascx", ViewData); %>

Также вы подтвердили, что ViewData [ "Test" ] находится в ViewData, прежде чем передавать его? Также обратите внимание, что при передаче ViewData в Partial Control важно сохранить модель равной.

Ник

Ответ 2

Это самый чистый способ, который я видел для этого:

<% Html.RenderPartial("/Views/Project/Projects.ascx", Model, new ViewDataDictionary{{"key","value"}});%>

Это может быть немного хаки, но это позволяет вам отправить модель через некоторые дополнительные данные.

Ответ 3

Не знаю, все ли по-прежнему заботятся, но я использовал KeyValuePair для ViewDataDictionary.

 <% Html.RenderPartial("ItemRow", item, new ViewDataDictionary{
        new KeyValuePair<string, object>("url", url),
        new KeyValuePair<string, object>("count", count),
        new KeyValuePair<string, object>("className", className)
 }); %>

Таким образом вы можете написать все в одном заявлении. Доступ к KVP можно получить в представлении:

<%= ViewData["url"] %>
<%= ViewData["count"] %>
<%= ViewData["className"] %>

В то время как через мою модель можно пройти через модель. *

Ответ 4

Я использую RTM-версию ASP.Net MVC, но с помощью:

<% Html.RenderPartial("~/Views/Project/Projects.ascx", new ViewDataDictionary(new {Key = "Some value"})); %>

При ссылке на значение в частичном представлении попробуйте следующее:

<%= ViewData.Eval("Key") %>

Это похоже на трюк для меня. Он также будет работать, если вы просто сделаете это:

<% Html.RenderPartial("~/Views/Project/Projects.ascx", new {Key = "Some value"}); %>

Надеюсь, что это поможет.

Ответ 5

В вашем основном представлении:

<% Html.RenderPartial("~/Views/Project/Projects.ascx", ViewData["Projects"]); %>

Либо в вашем контроллере, либо в главном представлении:

ViewData["Test"] = "Mark";

Если вы не указываете словарь данных модели или представления в RenderPartail, он использует те, которые содержатся в отображаемом представлении.