2009-03-15 7 views
0

S'il vous plaît, quelqu'un peut-il indiquer où ce code pourrait ne pas fonctionner? J'essaie de créer une classe partielle pour la page maître.Fichier de code ASP.NET MVC Masterpage

Les pages de maître de classe:

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(); 
    } 
}} 

La page principale:

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

L'erreur:

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> 

Je suis juste en utilisant comme un exemple. Le code que je veux utiliser doit se déclencher à chaque page pour vérifier certains paramètres, c'est pourquoi il est dans la page maître.

Répondre

0

Vous ne devriez pas avoir à créer une classe partielle. À quoi ressemble le code d'action de votre contrôleur? L'erreur semble provenir de ne pas avoir donné à la vue (et donc à la page maître) un modèle.

Essayez quelque chose comme ceci:

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; } 
    } 
} 

Définissez ensuite votre page maître comme vous aviez:

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

Maintenant, dans votre contrôleur

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); 
} 

Voir comment ça se passe ...

I w ould demande pourquoi MasterPage a besoin de taper fortement ViewData. Je comprends que oui, parfois viewdata fortement typé est nécessaire dans les pages master mais généralement vous devriez être en mesure de passer à l'utilisation de la collection de valeurs de nom ViewData.

0

Votre page maître ne doit-elle pas hériter Site et pas System.Web.Mvc.ViewMasterPage? Non où votre définition de page maître référence-t-elle réellement la classe Site.

0

Dans votre code,

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

ViewData.Model = new BaseViewData(); n'est pas nécessaire. Le BaseViewData doit être transmis via le contrôleur. En d'autres termes, toutes vos vues doivent rechercher une vue qui hérite de la vue de base. La page principale aura le même objet que la classe de base BaseViewData. Le code de votre contrôleur semble être correct pour ce faire.

Une autre chose qui semble être différent de mon code similaire est Hérite = System.Web.Mvc.ViewMasterPage<MuniWeb.Models.SiteMaster.BaseViewData> doit être Hérite = my.codebehind.class, votre codebehind hériterait ViewMasterPage<MuniWeb.Models.SiteMaster.BaseViewData>.

Je ne viens pas de voir le code en tant que tel, peut-être que ça marche?

Questions connexes