重写 CreateTempDataProvider() 以解决 System.Web.Mvc.Controller.Po

本文关键字:Web Mvc Controller Po System 解决 CreateTempDataProvider 重写 | 更新日期: 2023-09-27 18:36:40

所以我只是在我的MVC3站点上实现了一个基本控制器,以便在加载每个视图之前执行一些事情。特别是我想要一些可以充当后台母版页代码的东西。一旦我滚动它并使我的所有控制器都继承从我的基本控制器继承,我就会收到此错误:

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

[NullReferenceException: Object reference not set to an instance of an object.]
System.Web.Mvc.Controller.PossiblyLoadTempData() +11
System.Web.Mvc.Controller.ExecuteCore() +38
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() +8970061
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184

我读过一些地方,你需要覆盖CreateTempDataProvider()并返回一些东西或其他东西,但我不能完全弄清楚这样做的代码。我对 .NET 相对较新,以前还没有覆盖过任何东西,所以我不确定如何做到这一点。如果您以前遇到过这种情况,或者知道该怎么做,请提供帮助!

这是我的基本控制器以及到目前为止我所做的覆盖尝试无济于事:

 public class BaseController : Controller
{
    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
        string document = Path.Combine(HttpRuntime.AppDomainAppPath, "quote.xml");
        string _quote = "";
        string _author = "";
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(document);
        XmlNode Quote = xmlDoc.SelectSingleNode("quote/text");
        XmlNode Author = xmlDoc.SelectSingleNode("quote/author");
        _quote = Quote.InnerText;
        _author = Author.InnerText;
        ViewData["Quote"] = _quote;
    }
    protected override ITempDataProvider CreateTempDataProvider()
    {
        return base.CreateTempDataProvider();
    }
}

这是我开始调试时尝试运行的控制器(如果需要,则为 dunno):

public class BlogController : BaseController
{
    private DarkRobotEntities1 db = new DarkRobotEntities1();
    //
    // GET: /Blog/
    public ViewResult Index()
    {
        var posts = db.Posts.Include(p => p.Blog).Include(p => p.Comments);
        return View(posts.ToList());
    }
...
}

重写 CreateTempDataProvider() 以解决 System.Web.Mvc.Controller.Po

您需要

在重写的Initialize()方法的顶部调用base.Initialize()来初始化基Controller类。

否则,将永远不会设置PossiblyLoadTempData()使用的属性。

相关文章: