강력한 형식의 부분 뷰에 추가 ViewData 전달


174

ProductImage를 사용하는 강력한 형식의 Partial View가 있으며 렌더링 할 때 포함하는 페이지에서 동적으로 생성하는 추가 ViewData도 제공하고 싶습니다. RenderPartial 호출을 사용하여 강력한 형식의 객체와 사용자 정의 ViewData를 부분 뷰로 전달하는 방법은 무엇입니까?

var index = 0;
foreach (var image in Model.Images.OrderBy(p => p.Order))
{
  Html.RenderPartial("ProductImageForm", image); // < Pass 'index' to partial
  index++;
}

답변:


251

RenderPartial은 단순히 ViewDataDictionary 인 다른 매개 변수를 사용합니다. 당신은 거의 거기에 있습니다.

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       new ViewDataDictionary { { "index", index } }
); 

이것은 다른 모든 뷰가 기본적으로 가지고있는 기본 ViewData보다 우선합니다. ViewData에 무언가를 추가하는 경우이 새로운 사전에 부분 뷰로 전달되지 않습니다.


2
이 작업을 수행하려고하는데 "void를 객체로 변환 할 수 없습니다"를 반환합니다.
programad

4
@programad @ Html.RenderPartial ()에서 @를 제거하면 문제가 해결되었지만 @ {} 코드 블록 내의 줄에서 RenderPartial ()을 호출했습니다.
danjarvis

5
아래에서 ctorx의 답변을 확인하는 것이 좋습니다. 그는 기존 ViewData에 추가 데이터를 추가합니다.
raRaRa

162

womp 게시 내용을 확장하기 위해 다음 과 같은 생성자 오버로드를 사용하는 경우 기존의 View Data를 유지하면서 새로운 View Data를 전달할 수 있습니다ViewDataDictionary .

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       new ViewDataDictionary(this.ViewData) { { "index", index } }
); 

3
TemplateInfo.HtmlFieldPrefix그렇지 않으면 재설정 될 자식 컨트롤 을 유지해야하는 경우 매우 유용합니다.
Simon_Weaver

12
이것은 확실히 더 나은 솔루션입니다. ViewData가 손실되면 ModelState 및 모든 유효성 검사가 손실됩니다. +1
Kevin Farrugia

ViewDataDictionary에서 TemplateInfo.HtmlFieldPrefix를 전달하지 않은 경우에만 작동하는 것 같습니다. 답변에 그림과 같이 변수를 전달하거나 TemplateInfo.HtmlFieldPrefix를 전달할 수 있지만 둘 다 전달할 수는 없습니다.
Ferox

45
@Html.Partial("_Header", new ViewDataDictionary { { "HeaderName", "User Management" }, { "TitleName", "List Of Users" } })
or
@{Html.RenderPartial("_Header", new ViewDataDictionary { { "HeaderName", "User Management" }, { "TitleName", "List Of Users" } });}

부분 페이지 (_Header) :

<div class="row titleBlock">
    <h1>@ViewData["HeaderName"].ToString()</h1>
    <h5>@ViewData["TitleName"].ToString()</h5>
</div>

2
이것은 가장 완전한 대답처럼 보입니다 (.ToString ()이 불필요하지만).
Colin

9

나는 이것이 효과가 없다고 생각합니까?

ViewData["currentIndex"] = index;

6
이것은 매우 강력한 방법은 아니지만 Womp의 답변에서 뷰 데이터 값을 검색하는 방법을 알아내는 데 도움이되었습니다.
Mathias Lykkegaard Lorenzen

6

강력한 형식의 클래스가 포함 된 다른 클래스를 만듭니다.

수업에 새 물건을 추가하고보기에 반환하십시오.

그런 다음보기에서 새 클래스를 상속하고 오류가 발생할 코드 비트를 변경하십시오. 즉 필드에 대한 참조입니다.

도움이 되었기를 바랍니다. 그렇지 않은 경우 알려 주시면 특정 코드를 게시하겠습니다.


4

추가 데이터를 전달하는 가장 쉬운 방법은 @Joel Martinez 노트와 같이 뷰의 기존 ViewData에 데이터를 추가하는 것입니다. 그러나 ViewData를 오염시키지 않으려면 RenderPartial에는 표시하는 두 개의 인수 버전뿐만 아니라 세 개의 인수를 취하는 메소드가 있습니다. 세 번째 인수는 ViewDataDictionary입니다. 전달하려는 추가 데이터 만 포함하는 부분에 대해서만 별도의 ViewDataDictionary를 구성 할 수 있습니다.


1

이것도 효과가 있습니다.

this.ViewData.Add("index", index);

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       this.ViewData
); 

감사! 이것은 자식 부분 등에 대한 ViewData 사전을 확장 할 때 정말 유용합니다.
developius

1

나는 이것이 오래된 게시물이라는 것을 알고 있지만 핵심 3.0을 사용하는 비슷한 문제에 직면했을 때 그것을 보았습니다. 누군가에게 도움이되기를 바랍니다.

@{
Layout = null;
ViewData["SampleString"] = "some string need in the partial";
}

<partial name="_Partial" for="PartialViewModel" view-data="ViewData" />

0

동적 변수 ViewBag를 사용할 수 있습니다

ViewBag.AnotherValue = valueToView;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.