2009-03-15 18 views
0

Bitte kann jemand darauf hinweisen, wo dieser Code falsch laufen könnte. Ich versuche, eine partielle Klasse für die Masterpage zu erstellen.ASP.NET MVC Masterpage Codedatei

Die Master-Seiten-Klasse:

namespace MuniWeb.Models.SiteMaster{ 

public class BaseViewData 
{ 
    public string Title { get; set; } 
    public string MetaKeywords { get; set; } 
    public string MetaDescription { get; set; } 
} 

public partial class Site : System.Web.Mvc.ViewMasterPage<MuniWeb.Models.SiteMaster.BaseViewData> 
{ 
    public Site() 
    { 
     ViewData.Model = new BaseViewData(); 
    } 
}} 

Die Masterseite:

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage<MuniWeb.Models.SiteMaster.BaseViewData>" %> 

Der Fehler:

Object reference not set to an instance of an object. 
Line 33:    <div id="footer"> 
Line 34:     ApplicationID: 
Line 35:     <%= Model.Title %> 
Line 36:    </div> 
Line 37:   </div> 

ich gerade dies als Beispiel bin. Der Code, den ich verwenden möchte, muss für jede Seite ausgelöst werden, um bestimmte Parameter zu überprüfen. Deshalb befindet er sich auf der Masterseite.

Antwort

0

Sie sollten keine Teilklasse erstellen müssen. Wie sieht der Controller Action Code aus? Der Fehler sieht so aus, als ob er die View (und damit die Masterseite) nicht einem Modell übergeben könnte.

versuchen, etwas wie folgt aus:

namespace MuniWeb.Website.ViewDataModels { 

    public class BaseViewData 
    { 
     public string Title { get; set; } 
     public string MetaKeywords { get; set; } 
     public string MetaDescription { get; set; } 
    } 

    public class SubViewData : BaseViewData 
    { 
     public IList<Thing> Things { get; set; } 
    } 
} 

Dann definieren Sie Ihre Masterseite wie Sie hatte:

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage<MuniWeb.Website.ViewDataModels.BaseViewData>" %> 

Jetzt in Ihrem Controller

public ActionResult Index() 
{ 
    SubViewData viewData = new SubViewData(); 
    viewData.Title = "Page Title"; 
    viewData.MetaKeywords = "This, that, and the other"; 
    viewData.MetaDescription = "A really great page about this, that, and the other."; 

    viewData.Things = _myRepository.GetThings(); 

    return View(viewData); 
} 

Sehen Sie, wie das geht ...

ich w Ich möchte fragen, warum die MasterPage dringend ViewData eingibt. Ich verstehe, dass ja, manchmal stark typisierte viewdata in masterpages benötigt wird, aber im Allgemeinen sollten Sie in der Lage sein, mit der Verwendung der ViewData-Name-Wertauflistung umzugehen.

0

Sollte Ihre Masterseite Site und nicht System.Web.Mvc.ViewMasterPage erben? Nein, wo Ihre Masterseitendefinition tatsächlich auf die Site-Klasse verweist.

0

in Ihrem Code

public partial class Site : 
     System.Web.Mvc.ViewMasterPage<MuniWeb.Models.SiteMaster.BaseViewData> 
{ 
    public Site() 
    { 
     ViewData.Model = new BaseViewData(); 
    } 
}} 

ViewData.Model = new BaseViewData(); ist nicht erforderlich. Die BaseViewData sollte über den Controller weitergegeben werden. Mit anderen Worten, alle Ihre Ansichten sollten nach einer View suchen, die die Basisansicht erbt. Auf der Masterseite wird dasselbe Objekt wie die Basisklasse BaseViewData umgewandelt. Ihr Controller-Code scheint dabei korrekt zu sein.

Eine andere Sache, die von meinem ähnlichen Code, anders zu sein scheint, ist Erbt = System.Web.Mvc.ViewMasterPage<MuniWeb.Models.SiteMaster.BaseViewData> sollte Erbt = my.codebehind.class, dann würde Ihr Code-Behind ViewMasterPage<MuniWeb.Models.SiteMaster.BaseViewData> erben.

Ich habe gerade nicht den Code als solcher gesehen, vielleicht funktioniert es?

Verwandte Themen