代码之家  ›  专栏  ›  技术社区  ›  Simon Gillbee

具有MVC成员身份(OpenID)控制器的ASP MVC空引用异常

  •  1
  • Simon Gillbee  · 技术社区  · 16 年前

    ASP.NET MVC Membershp Starter 工具包集成到我正在开发的一个站点中,以获得OpenID支持。

    我已经解决了好几个问题,但是我一直在寻找一个空引用异常,这让我感到困惑。以下是流程:

    1. MVC MembershipAdministrationController已正确启动。它检测到当前没有登录的用户,因此使用登录表单(login.aspx)进行响应。
    2. 呈现此表单时引发空引用异常。具体而言,引发异常的部分是:

      <% using(Html.Form( "OpenID", "Login" )){ %>
        <fieldset class="MvcMembership">
          <legend>Login</legend>
          <div><label for="openid_identifier">OpenID Url:</label> <% =Html.TextBox( "openid_identifier" )%></div>
          <div><% =Html.SubmitButton( "submit", "Login", new { onclick = "return starterKit_mvc_membership_validateOpenIdLogin();" } )%></div>
        </fieldset>
      <% } %>
      

    对Html.Form(“OpenID”、“Login”)的调用是引发异常的调用。以下是调用堆栈:

    System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.NullReferenceException: Object reference not set to an instance of an object.
       at System.Collections.Generic.Dictionary`2.Enumerator.MoveNext()
       at System.Web.Routing.ParsedRoute.Bind(RouteValueDictionary currentValues, RouteValueDictionary values, RouteValueDictionary defaultValues, RouteValueDictionary constraints)
       at System.Web.Routing.Route.GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
       at System.Web.Routing.RouteCollection.GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
       at Microsoft.Web.Mvc.FormExtensions.Form(HtmlHelper helper, String controllerName, String actionName, FormMethod method, IDictionary`2 htmlAttributes)
       at Microsoft.Web.Mvc.FormExtensions.Form(HtmlHelper helper, String controllerName, String actionName)
       at ASP.views_openid_login_aspx.__RenderopenIdLoginContent(HtmlTextWriter __w, Control parameterContainer) in d:\Data\Personal\purplemartin.tv\mvc\MvcMembership\Views\OpenID\Login.aspx:line 15
       at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
       at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
       at System.Web.UI.Control.Render(HtmlTextWriter writer)
       at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
       at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
       at System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
       at ASP.views_shared_site_master.__Render__control1(HtmlTextWriter __w, Control parameterContainer) in d:\Data\Personal\purplemartin.tv\mvc\MvcMembership\Views\Shared\Site.Master:line 46
       at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
       at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
       at System.Web.UI.Control.Render(HtmlTextWriter writer)
       at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
       at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
       at System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
       at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
       at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
       at System.Web.UI.Page.Render(HtmlTextWriter writer)
       at System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer)
       at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
       at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
       at System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
       at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
       --- End of inner exception stack trace ---
       at System.Web.UI.Page.HandleError(Exception e)
       at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
       at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
       at System.Web.UI.Page.ProcessRequest()
       at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context)
       at System.Web.UI.Page.ProcessRequest(HttpContext context)
       at ASP.views_openid_login_aspx.ProcessRequest(HttpContext context) in c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\cada2385\9a6742fc\App_Web_zl9plrr2.1.cs:line 0
       at System.Web.Mvc.ViewPage.RenderView(ViewContext viewContext)
       at System.Web.Mvc.WebFormView.RenderViewPage(ViewContext context, ViewPage page)
       at System.Web.Mvc.WebFormView.Render(ViewContext viewContext, TextWriter writer)
       at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
       at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<InvokeActionResultWithFilters>b__e()
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
       at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10()
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult)
       at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
       at System.Web.Mvc.Controller.ExecuteCore()
       at System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)
       at System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext)
       at System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext)
       at System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext)
       at System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext)
       at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
       at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
    

    根据要求,以下是控制器的外观:

        [HandleError( ExceptionType = typeof(OpenIdException) )]
        [HandleError( ExceptionType = typeof(System.Net.WebException) )]
        public virtual ActionResult Login( string openid_identifier )
        {
            //### set page title & declare variables
            ViewData["Title"] = "Login via OpenID";
            var errors = new List<string>();
            var rememberMe = false;
            var openid = new OpenIdRelyingParty();
    
            //### stage 1: display login form to user
            if( openid.Response == null && Request.HttpMethod != "POST" )
                return View();
    

    显然,这并不是控制器的完整部分,但这是第一次执行的全部内容(当呈现登录表单时)。第一次 openid.Response "POST" .

    4 回复  |  直到 16 年前
        1
  •  1
  •   Simon Gillbee    16 年前

    因为我对这个问题的回答很少,所以我开始寻找将OpenID集成到ASP.NETMVC中的替代方案。我找到了 RPXLib 这是一个很好的.NET和MVC包装 RPXNow . 这是一种从多个供应商处进行OpenID登录的web服务方法。

    这不是一个完美的解决方案,因为我必须编写openid凭据和本地配置文件之间的映射代码,但它足以满足我的需要。

    我仍然对解决原始问题感兴趣 Html.Form("controller", "action") 正在引发空引用异常。我尝试过使用通用版本,但结果相同: Html.Form<Controller>(c => c.Action())

        2
  •  1
  •   eu-ge-ne    16 年前

    您是否使用ASP.NET MVC v1.0(不是预览版、测试版或RC版)?v1.0中似乎没有Html.Form,只有Hrml.BeginForm。如果查看ASP.NET MVC v1.0源代码,System.Web.MVC.Html.FormExtensions类中没有表单方法,只有BeginForm

        3
  •  1
  •   Adrian Grigore    16 年前

    如果所有其他操作都失败,您仍然可以下载 ASP.NET MVC source ,将其连接到项目并进行调试。这是一个多一点的努力,但它确实有助于找出什么是错误的引擎盖下。

        4
  •  1
  •   eu-ge-ne    16 年前

    西蒙,你是说“System.Web.Mvc.Html.FormExtensions”而不是“Microsoft.Web.Mvc.FormExtensions”吗?有“Microsoft.Web.Mvc.FormExtensions”类( http://aspnet.codeplex.com/SourceControl/changeset/view/22929#266407 )但是没有形式方法。可能您正在使用旧版本的Microsoft.Web.Mvc.dll?在Reflector中打开Microsoft.Web.Mvc.dll-在我的计算机上,Microsoft.Web.Mvc.dll的版本为1.0.0.0,有4种方法:

    public static MvcForm BeginForm<TController>(this HtmlHelper helper, Expression<Action<TController>> action) where TController: Controller;
    public static MvcForm BeginForm<TController>(this HtmlHelper helper, Expression<Action<TController>> action, FormMethod method) where TController: Controller;
    public static MvcForm BeginForm<TController>(this HtmlHelper helper, Expression<Action<TController>> action, FormMethod method, IDictionary<string, object> htmlAttributes) where TController: Controller;
    public static MvcForm BeginForm<TController>(this HtmlHelper helper, Expression<Action<TController>> action, FormMethod method, object htmlAttributes) where TController: Controller;
    

    声明类型:Microsoft.Web.Mvc.FormExtensions

    更新:

    ASP.Net MVC Membership Starter Kit Preview 5 (0.5) . there .