2014-10-11 20 views
0

这是我的第一个MVC项目,所以我学到了很多东西。现在我得到一个错误,我不知道它来自哪里。我采用了默认的帐户控制器,并将其指向我自己的SQL数据库,如下所示。我把[Authorize]属性放在每个控制器上,这样只有登录页面可以被访问。一旦用户登录,它将允许他们访问所有页面,但它首先会重定向到此错误:MVC帐户控制器错误和LogOff不起作用

错误。 处理您的请求时发生错误。

此外,更改帐户控制器后,LogOff操作停止工作。我改变它如下所示,但它仍然无法正常工作。奇怪的是,这个错误并没有出现在昨天。我接近这个项目的最后期限,所以任何帮助将不胜感激,谢谢!

下面是修改的帐户控制器代码

// 
    // GET: /Account/Login 
    [AllowAnonymous] 
    public ActionResult Login(string returnUrl) 
    { 
     ViewBag.ReturnUrl = returnUrl; 
     return View(); 
    } 

    // 
    // POST: /Account/Login 
    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      using (ixdb_siNet_ConfigurationEntities userdb = new ixdb_siNet_ConfigurationEntities()) 
      { 
       var objUser = userdb.ixoc_Users.FirstOrDefault(x => x.name == model.UserName && x.password == model.Password); 
       if (objUser != null) 
       { 
        FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 
        if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/") && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\")) 
        { 
         return Redirect(returnUrl); 
        } 
        else 
        { 
         return RedirectToAction("Index", "Dashboard"); 
        } 
       } 
      } 
     } 
     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

    // 
    // POST: /Account/LogOff 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult LogOff() 
    { 
     //AuthenticationManager.SignOut(); 
     Request.Cookies.Remove("UserId"); 
     FormsAuthentication.SignOut(); 
     return RedirectToAction("Index", "Dashboard"); 
    } 

以下是在 '/' 应用堆栈跟踪

服务器错误。你调用的对象是空的。说明:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关该错误的更多信息以及源代码的位置。

异常详细信息:System.NullReferenceException:未将对象引用设置为对象的实例。

源错误:

在当前web请求的执行过程中生成未处理的异常。关于异常的来源和位置的信息可以使用下面的异常堆栈跟踪来标识。

堆栈跟踪:

[NullReferenceException异常:对象没有设置为一个对象的一个​​实例。]在C siNetWebApplication.Controllers.DashboardController.Index(字符串的startDate,字符串结束日期):\梅林\顾客\堰\ Git \ siNetWebApplication \ siNetWebApplication \ Controllers \ DashboardController.cs:29 lambda_method(Closure,ControllerBase,Object [])+178 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary2 parameters)+241 System.Web.Mvc.ControllerActionInvoker .InvokeActionMethod(ControllerContext controllerContext,ActionDescriptor actionDescriptor,IDictionary2参数)+38 System.Web.Mvc.Async.AsyncControllerActionInvoker.b__36(IAsyncResult asyncResult,ActionInvocation innerInvokeState)+11 System.W eb.Mvc.Async.WrappedAsyncResult2.CallEndDelegate(IAsyncResult asyncResult)+138 System.Web.Mvc.Async.AsyncInvocationWithFilters.b__3c()+111 System.Web.Mvc.Async。 <> c__DisplayClass45.b__3e()+452 System.Web.Mvc.Async。 <> c__DisplayClass30.b__2f(IAsyncResult asyncResult)+15 System.Web.Mvc.Async。 <> c__DisplayClass28.b__19()+37 System.Web.Mvc.Async。 <> c__DisplayClass1e.b__1b(IAsyncResult的asyncResult)241 System.Web.Mvc.Controller.b__1d(IAsyncResult的asyncResult,ExecuteCoreState innerState)29 System.Web.Mvc.Async.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult的asyncResult)111的System.Web。 Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult)+53 System.Web.Mvc.Async.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult asyncResult)+19 System.Web.Mvc.MvcHandler.b__4(IAsyncResult asyncResult,ProcessRequestState innerState)+51 System.Web。 Mvc.Async.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult asyncResult)+111 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+606 System.Web.HttpApplication。ExecuteStep(IExecutionStep步骤,布尔型&已同步完成)+288

+0

你能分享你得到的异常,而不是通用的错误消息吗?尝试使用调试器逐步执行代码,并查看是否可以确定错误发生的位置。 – Tobias 2014-10-11 20:01:15

+0

只有在将它复制到IIS服务器并在线查看它之后,它才会在调试模式下发生。 – spacecowboy 2014-10-11 20:05:41

+0

您使用的是什么版本的MVC? – nityan 2014-10-11 21:45:13

回答

0

您在登录时提到了“出错,处理请求时发生错误”。然后一切正常。它似乎是“错误。处理您的请求时发生错误。”是从/Views/Shared/Error.cshtml页面。只要确保/ Dashboard/Index是您应用程序的有效网址。

您需要关闭web.config中的自定义错误以获取该错误的实际原因。这也将帮助您解决注销问题。

<system.web> 
    <customErrors mode="Off" /> 
</system.web> 
+0

是的,它显示Views/Shared/Error.cshtml和/ Dashboard/Index是绝对有效的,我可以从错误页面点击它。谢谢我会尝试关闭自定义错误,看看会发生什么...... – spacecowboy 2014-10-11 21:37:06

+0

尝试在web.config中设置以查看实际错误。 – sanjeev 2014-10-11 21:38:03

1

您很可能没有将防伪造令牌传递给LogOff操作。

您已在操作上获得[ValidateAntiForgeryToken]属性,因此您需要通过此操作,否则您将收到错误消息。如果您将@sanjeev提到的自定义错误关闭,您可能会看到有关防伪标记未被传递的错误。

在你看来

@Html.AntiForgeryToken() 
+0

谢谢@heymega注销开始工作,当我测试它,但即时通讯仍然得到登录错误。顺便说一下,在Log out调用注销表单的方式? – spacecowboy 2014-10-11 23:59:31

+0

您是否关闭了自定义错误,以便您可以看到实际的错误消息?注销表单有一个logoutform的ID,所以你应该能够很容易地找到它。 – heymega 2014-10-12 10:29:04

0

这个添加到窗体,您可以删除async Task<ActionResult>和使用ActionResult进行登录POST方法?