2013-02-03 9 views
0

그래서 내가 만든 MVC3 레이아웃에서 이상한 일이 발생했습니다. BaseVM에 강하게 입력됩니다. 모든 View 모델은 BaseVM에서 상속됩니다. 내가 디버깅하고 코드를 단계별로 실행하고 레이아웃을 단계별로 진행하면 BaseVM 모델이 null이 아니며 바닥 글의 저작권에 대한 현재 연도를 가져 오는 메소드를 호출합니다. 그러나 레이아웃의 맨 아래로 가면 마침내 속성을 호출하여 예외적으로 예외를 던져서 갑자기 모델이 null이됩니다. 이제는 응용 프로그램에 오류 화면이나 메시지가 표시되지 않지만이 예외는 페이지가로드 될 때마다 기록됩니다.MVC3 @ 모델이 레이아웃에서 null이 됨

public class BaseVM 
{ 
    public string CurrentYear 
    { 
     get 
     { 
      return DateTime.Today.Year.ToString(); 
     } 
    } 

    public BaseVM() 
    { 
    } 
} 

public class PrelaunchReserveVM : BaseVM 
{ 
    public PrelaunchDTO Prelaunch { get; set; } 

    public PrelaunchReserveVM() 
     : this(new PrelaunchDTO()) { } 

    public PrelaunchReserveVM(PrelaunchDTO prelaunch) 
     : base() 
    { 
     this.Prelaunch = prelaunch; 
    } 
} 

컨트롤러의 동작 : 다음 코드 샘플의

public ActionResult Reserve() 
{ 
    return View("Reserve", new PrelaunchReserveVM(new PrelaunchDTO())); 
} 

레이아웃 :

@model StickyThink.Models.VM.BaseVM 

...

<div id="container"> 
    <div id="main" role="main" style="padding: 0px; margin: 0px;"> 
     @RenderBody() 
    </div> 
</div> 

<footer> 
    <div id="FooterPageContainer" class="center"> 
     Copyright &copy @Model.CurrentYear ... All rights reserved. 
    </div> 
</footer> 
<!-- END: Add your site or application content here --> 
@Html.Partial("_Scripts") 
@RenderSection("scripts", false); 

그래서 @ Model.CurrentYear로 들어가고 model은 null이 아닙니다. 그런 다음 뷰에서 일부 스크립트를 렌더링하기 위해 @RenderSection으로 이동 한 다음 예외가 발생하고 @Model이 null입니다. 생각?

+0

'RenderSection'의 모양은 무엇입니까? –

+2

_Layout 내부의 어떤 모델입니까? 이것은 말이되지 않습니다. 레이아웃은 동일하지만 모델은 각 뷰에 대해 고유합니다. –

+0

예외는 무엇입니까? –

답변

1

모델을 @Html.Partial("_Scripts", Model)의 두 번째 매개 변수로 전달해야합니다.

+0

Include로 사용중인 경우가 아닙니다. –

+0

어떻게 그렇게? 나는 "Include로서 사용되는 Model"에 익숙하다는 것을 확신하지 못한다. 그것은 내가 가지고있는 것이지만 그 용어에 익숙하지 않은 것일 수 있습니다. – krillgar

+0

일부는 포함물처럼 사용됩니다. 모델을 사용하지 않으면 모델이 필요 없습니다. –

0

야생적인 추측을해야한다면 _Scripts 부분의 내용에 문제가 있다고 생각합니다. 어쩌면 모델 @krillgar가 필요 하겠지만, 내 추측은 그렇지 않을 것입니다. _Scripts 부분을 부분이 아닌 부분으로 이동하고 일반 텍스트처럼 헤더에서 스크립트를 참조하는 것이 좋습니다. 나는이 예외가 이전에 얼굴을 보여줄 것이고 문제를 찾는데 도움이 될 것이라고 생각한다. 모델이 null이되는 이유는 예외 유형이기 때문이다. 따라서 _Scripts 부분을 이동하고 이전에 null을 가졌다면이 곳을 볼 수 있습니다.

+0

RenderSection과 함께 _scripts 부분을 위로 이동했습니다. 그것을 통해 스테핑은 @ Model.CurrentYear에 도착하고 문서의 끝에 "객체 참조가 객체의 인스턴스로 설정되지 않음"을 throw하는 1 년 후, 바로 다음에 있음을 보여줍니다. 예외. 그것은 아무 의미가 없습니다. 내 NuGet 패키지와 관련이있을 수 있습니다. 새 프로젝트를 만들고 문제를 재현하려고합니다. :-) – Meadock

관련 문제