2012-06-01 4 views
3

cshtml 부분보기의 뷰 모델을 얻을 수내가 인덱스 페이지에 PartialView이

@model MvcCommons.ViewModels.ImageModel 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table> 
    @foreach (var item in Model) { 
     <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.FileName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Description) 
     </td> 
     </tr> 
    } 
</table> 

지금에 따라 선언, PartialView의 상단에 ViewModels.ImageModel 내부에 들어가기로되어 있고 그 클래스 안에는 다음과 같은 생성자가 있습니다. -

public ImageModel() 
{ 
    XDocument imageMetaData = XDocument.Load(uploadsDir + @"/ImagesMetaData.xml"); 
    var images = from image in imageMetaData.Descendants("image") 
       select new Image(image.Element("filename").Value, 
       image.Element("description").Value); 
    this.AddRange(images.ToList<Image>()); 
} 

그러나 어떤 이유로 ImageUpload 부분 뷰에서 디버깅 할 때이 ViewModel 생성자로 리디렉션되지 않고 PartialView 내부의 모델이 null입니다.

여기에 뭔가가 있습니까?

실제로 생성자를 통과 시키려면 어떻게해야합니까? 또한 PartialView를 호스팅하는 주 인덱스 페이지에서 @model을 수행해야합니까? 여러분의 도움과 시간

답변

4

라인 @model MvcCommons.ViewModels.ImageModel은 강하게 유형화 된 모델을 선언하는 데 사용되지만 인스턴스화하지 않습니다. 그런데

@Html.Partial("ImageUpload", <yourmodel>) 

, 귀하의 경우 :

@Html.Partial("ImageUpload", new ImageModel()) 

그러나 자르 :

당신은

@{ Html.RenderPartial("ImageUpload", <yourmodel>); } 

이상의 간단한 사용해야 모델이 덜 생성자해야하며, XML을로드/파싱하지 않습니다. 이 작업은 컨트롤러에서 수행해야합니다 (그리고 캐싱 시스템에 설정되어 있어야합니다).

메인 뷰 모델을 덜 유지하려는 경우 부분 렌더링을 위해 ChildActionOnly 특성을 사용하여 동작을 만들고 @Html.Action(...)으로 호출하면 새 ControllerContext가 만들어집니다.

+0

정상적으로 작동합니까, 답을 2 개까지 설정할 수 있습니까? 둘 다 맞습니다. 또 다른 메모에서, 당신은 내 모델은 생성자가 적다 고 말했습니다. 나는 실제로 컨트롤러를 가지고 있으므로 @Html.Partial ("ImageUpload", "File")과 같은 작업을 수행해야합니다. FileController 인 파일 – Johann

+0

작은 예제를 제공 할 수 있습니까? PartialView에서 어떻게 컨트롤러를 호출하고 XML을 채울 수 있습니까? – Johann

+0

컨트롤러로 관리했기 때문에 조언을 주셔서 감사 드리며 모든 도움을 받으실 수 있습니다. – Johann

3

에 대한

덕분에 당신은 부분보기의 모델을 설정하지 않습니다. 그것은 모델을 만들 수있는 뷰의 책임이 아니다 http://msdn.microsoft.com/en-us/library/dd492962.aspx

@{ Html.RenderPartial("ImageUpload", myModel); } 

를 참조하십시오, 당신은 부분 뷰를 포함하는 뷰의 관련 컨트롤러에이를 인스턴스화해야합니다.

관련 문제