【问题标题】:Override CreateTempDataProvider() to solve null reference exception at System.Web.Mvc.Controller.PossiblyLoadTempData()覆盖 CreateTempDataProvider() 以解决 System.Web.Mvc.Controller.PossiblyLoadTempData() 处的空引用异常
【发布时间】:2012-06-11 02:11:42
【问题描述】:

所以我刚刚在我的 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();
    }
}

这是我开始调试时尝试运行的控制器(不知道你是否需要它):

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

【问题讨论】:

    标签: c# asp.net-mvc-3 controller overriding


    【解决方案1】:

    您需要在覆盖的Initialize() 方法的顶部调用base.Initialize() 来初始化Controller 基类。

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

    【讨论】:

    • 好吧,冒着看起来更无知的风险..我应该将什么传递给 initialize()?
    • @davidisawesome:您在覆盖中收到的参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多