Исключение нулевой ссылки ASP MVC с контроллером MVC Membership (OpenID)

Я заранее извинюсь. Я новичок в ASP.NET и MVC и еще не разбираюсь во внутреннем устройстве и потоке операций. Я пытаюсь интегрировать ASP.NET MVC Membershp Starter Kit в сайт, который я разрабатываю, чтобы получить Поддержка OpenID.

Я проработал несколько проблем, но не могу понять, с чего начать поиск исключения нулевой ссылки, которое я продолжаю получать. Вот поток:

  1. Пользователь нажимает «Войти» на странице
  2. MVC MembershipAdministrationController правильно запущен. Он обнаруживает, что в данный момент нет пользователя, вошедшего в систему, и поэтому отвечает формой входа (Login.aspx).
  3. При рендеринге этой формы возникает исключение нулевой ссылки. В частности, раздел, который вызывает исключение:

    <% 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 имеет значение null, а метод запроса — "POST".

С чего начать поиск проблемы? Похоже, что это может иметь какое-то отношение к маршрутизации, но я не уверен.


person Simon Gillbee    schedule 27.04.2009    source источник
comment
Как выглядит код в контроллере?   -  person Jose Basilio    schedule 27.04.2009
comment
Я добавил контроллер (соответствующую часть) к основному вопросу. Спасибо, что посмотрели.   -  person Simon Gillbee    schedule 27.04.2009


Ответы (4)


Саймон, вы действительно имели в виду «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? Откройте свою Microsoft.Web.Mvc.dll в Reflector — на моей машине 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

Сборка: Microsoft.Web.Mvc, версия=1.0.0.0

ОБНОВЛЕНО:

Я загрузил ASP.Net MVC Membership Starter Kit Preview 5 ( 0.5). Microsoft.Web.Mvc.dll из папки bin имеет версию 1.0.0.0, но она старше, чем Microsoft.Web.Mvc.dll для ASP.NET MVC v1.0. Вы можете скачать последнюю версию Microsoft.Web.Mvc.dll здесь .

person eu-ge-ne    schedule 06.05.2009
comment
Ага... оказывается проблема с бета-релизом. Спасибо. - person Simon Gillbee; 26.08.2010

Поскольку я получил очень мало ответов на этот вопрос, я начал искать альтернативы для интеграции OpenID в ASP.NET MVC. Я нашел RPXLib, который является хорошей оболочкой .NET и MVC для RPXNow. Это подход веб-службы к входу в систему OpenID от нескольких поставщиков.

Это не идеальное решение, так как мне нужно написать код сопоставления между учетными данными openid и локальными профилями, но этого достаточно для моих нужд.

Я все еще заинтересован в разрешении исходной проблемы с Html.Form("controller", "action"), вызывающим исключение нулевой ссылки. Я пытался использовать общую версию с теми же результатами: Html.Form<Controller>(c => c.Action()).

person Simon Gillbee    schedule 28.04.2009

Вы используете ASP.NET MVC v1.0 (не Preview, Beta или RC)? Кажется, что в версии 1.0 нет Html.Form, а есть только Hrml.BeginForm. Если вы посмотрите на исходный код ASP.NET MVC v1.0, там нет метода Form, а есть только BeginForm в классе System.Web.Mvc.Html.FormExtensions.

person eu-ge-ne    schedule 03.05.2009
comment
На самом деле действительно кажется, что в MVC 1.0 есть метод расширения Html.Form. См. класс статического метода Microsoft.Web.Mvc.FormExtensions. Существует 7 перегрузок Form. Но FormBegin звучит интересно. Я посмотрю на это. - person Simon Gillbee; 06.05.2009
comment
Я думаю, вы используете старую версию Microsoft.Web.Mvc.dll. - person eu-ge-ne; 06.05.2009

Если ничего не помогает, вы все равно можете скачать исходный код ASP.NET MVC, подключите его к своему проекту и отладьте его. Это немного больше усилий, но это действительно помогает выяснить, что происходит не так под капотом.

person Adrian Grigore    schedule 06.05.2009