2010-12-07 11 views
2

J'ai lu que vous pouvez utiliser un ViewModel pour votre _Layout en rasoir, mais je ne vois pas d'exemples ...Exemple de mise en œuvre d'un ViewModel pour le rasoir _Layout.cshtml

Au sommet de mon _Layout j'ai ..

@inherits System.Web.Mvc.WebViewPage<CAPPortal.ViewModels.MasterViewModel> 

, mais chaque fois que je tente d'accéder à l'une des propriétés que je reçois une erreur ..

System.NullReferenceException: référence d'objet non définie à une instance d'un objet.

Line 23:   @Model.Foobar 

Exception:

[NullReferenceException: Object reference not set to an instance of an object.] 
ASP._Layout_cshtml.Execute() in d:\Visual Studio 2010\CAPPortal\CAPPortal\Views\Shared\_Layout.cshtml:23 
System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +172 
System.Web.Mvc.WebViewPage.ExecutePageHierarchy() +81 
System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +86 
System.Web.WebPages.<>c__DisplayClass7.<RenderPage>b__6(TextWriter writer) +98 
System.Web.WebPages.HelperResult.WriteTo(TextWriter writer) +12 
System.Web.WebPages.WebPageBase.Write(HelperResult result) +67 
System.Web.WebPages.WebPageBase.RenderSurrounding(String partialViewName, Action`1 b ody) +67 
System.Web.WebPages.WebPageBase.PopContext() +262 
System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +93 
System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) +220 
System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +115 
System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +303 
System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +13 
System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +23 
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +260 
System.Web.Mvc.<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b() +19 
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +177 
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +343 
System.Web.Mvc.Controller.ExecuteCore() +116 
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +97 
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10 
System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +37 
System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21 
System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12 
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62 
System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +50 
System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7 
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22 
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60 
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9 
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8841105 
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184 
+0

Veuillez afficher la trace de pile de l'exception. – Eilon

+0

BTW J'ai mis à jour ma réponse originale ... – Eilon

Répondre

2

S'il vous plaît assurez-vous que vous passez dans un objet modèle réel lorsque vous restituez la vue. Par exemple:

public ActionResult ShowStuff() { 
    return View(new MyModelType()); 
} 

Si vous ne passez pas dans un objet modèle alors la propriété Model sera en effet nulle, et en essayant d'accéder à une propriété de celui-ci dans la vue sera bien sûr jeter un NullReferenceException.

+0

Eilon, qu'en est-il lorsque le ViewModel est hérité par la mise en page, dois-je quand même le passer du contrôleur à la vue? – JBeckton

+0

@JBekton Si vous souhaitez utiliser la propriété Model, le contrôleur doit lui fournir une valeur. Vous pouvez toujours vérifier si c'est null en premier, et seulement ensuite creuser dans ses propriétés. – Eilon

+0

Si vous pensez pouvoir accéder aux propriétés et aux méthodes d'appel de l'objet 'Model', vous devez en faire une instance valide. – marcind