2010-01-22 3 views
16

Я пытаюсь вызвать этот метод:Pass ViewData к RenderPartial

RenderPartialExtensions.RenderPartial Method (HtmlHelper, String, Object, ViewDataDictionary) 

http://msdn.microsoft.com/en-us/library/dd470561.aspx

, но я не вижу какой-либо способ построения ViewDataDictionary в выражении, как:

<% Html.RenderPartial("BlogPost", Post, new { ForPrinting = True }) %> 

Любые идеи, как это сделать?

ответ

3

Вы можете сделать:

new ViewDataDictionary(new { ForPrinting = True }) 

Как ViewDataDictionary может принимать объект, чтобы отразить против в его конструкторе.

+1

Я пробовал это, но на другом конце ViewData.Count == 0. – Pablo

+1

Это читается как модель, а не как данные просмотра. – Pablo

+0

Вы правы, мои извинения. Я думал о RouteValuesDictionary, хотя и странно назван для этой функции, вы можете использовать это как новый RouteValuesDictionary (new {..}), и это извлекает значения свойств и делает их отдельными парами ключ/значение, которые затем вы можете передать им экземпляр viewdatadictionary. –

9

мне удалось сделать это с помощью следующего метода расширения:

public static void RenderPartialWithData(this HtmlHelper htmlHelper, string partialViewName, object model, object viewData) { 
    var viewDataDictionary = new ViewDataDictionary(); 
    if (viewData != null) { 
    foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(viewData)) { 
     object val = prop.GetValue(viewData); 
     viewDataDictionary[prop.Name] = val; 
    } 
    } 
    htmlHelper.RenderPartial(partialViewName, model, viewDataDictionary); 
} 

вызывающего это следующим образом:

<% Html.RenderPartialWithData("BlogPost", Post, new { ForPrinting = True }) %> 
+0

+1 для показа, как создать/изменить ViewDataDictionary, но не поклонник принятия строго типизированного метода и вместо этого использовать более свободно напечатанный, чтобы избежать объявления ViewDataDictionary. Если вы привыкнете к использованию RenderPartialWithData, но тогда вам понадобятся другие перегрузки RenderPartial, вам придется создавать еще больше перегрузок вашего собственного метода. Это умно, но я чувствую, что вы можете настраивать себя на большее количество работы, а не меньше. – AaronLS

24

Это работало для меня:

<% Html.RenderPartial("BlogPost", Model, new ViewDataDictionary{ {"ForPrinting", "true"} });%> 
0

Это не совсем то, что вы просили, но вы можете использовать ViewContext.ViewBag.

// in the view add to the ViewBag: 
ViewBag.SomeProperty = true; 
... 
Html.RenderPartial("~/Views/Shared/View1.cshtml"); 

// in partial view View1.cshtml then access the property via ViewContext: 
@{ 
    bool someProperty = ViewContext.ViewBag.SomeProperty; 
} 
Смежные вопросы