2011-04-21 4 views
1

J'ai une application MVC2 ASP.Net 4 qui a une page de connexion qui utilise la mise en page de la page maître de l'application. Le « défaut » page de connexion est typique:Html.BeginForm - Référence d'objet non définie sur une instance d'un objet

    using (Html.BeginForm("LogIn", "Home", FormMethod.Post, new { id = "LogIn" })) 
        { ....form stuff...} 

Maintenant, je dois montrer un journal à la page avec une mise en page totalement différent mais je veux qu'il fasse comme « défaut » la même chose (s) connecter c'est-à-dire appeler la même action du contrôleur et utiliser le même modèle Web.

Ils veulent que les utilisateurs d'accéder à www.mydomain.com/alternateLogOn.aspx

Je fais dans mon global.asax:

protected void Application_BeginRequest(object sender, EventArgs arg) 
    { if (Request.Url.PathAndQuery.ToLower() == "/AlternateLogOn.aspx") 
    { Context.RewritePath("/Views/Home/AlternateLogOn.aspx"); 
    } 
    } 

Cela me récupère la page que je veux pour montrer w/o la mise en page principale (non compris MasterPageFile =):

<%@ Page Language="C#" AutoEventWireup="true" Inherits="System.Web.Mvc.ViewPage<MySite.Web.Models.AccountLogIn>" %> 

la page affiche bien w/o l'utilisation de (Html.BeginForm), mais quand je l'utilise-je obtenir l'objet exception de référence.

est ici la trace de la pile:

Stack Trace:

[NullReferenceException: Object reference not set to an instance of an object.] 
System.Web.Mvc.Html.FormExtensions.BeginForm(HtmlHelper htmlHelper, String actionName, String controllerName, RouteValueDictionary routeValues, FormMethod method, IDictionary`2 htmlAttributes) +42 
System.Web.Mvc.Html.FormExtensions.BeginForm(HtmlHelper htmlHelper, String actionName, String controllerName, FormMethod method, Object htmlAttributes) +214 
ASP.views_home_alternatelogon_aspx.__Render__control1(HtmlTextWriter __w, Control parameterContainer) in d:\Visual Studio 2010\MySite\MySite.Web\Views\Home\AlternateLogon.aspx:32 
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +130 
System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer) +84 
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5273 

J'ai essayé d'ajouter <%@ Import namespace="System.Web.Mvc.Html" %> mais il ne permet pas

Merci ...

+0

Je suis un peu confus - si c'est une application MVC, pourquoi avoir des extensions .aspx de l'URL? –

Répondre

0

L'une des deux choses est arrivé ici: soit Html.RouteCollection est nulle, soit Html.ViewContext est null.

Je ne suis pas sûr à 100% ici, mais il semble que ASP.NET gère cette requête, pas MVC, d'où l'impossibilité de remplir ces valeurs. Cela aurait du sens puisque vous redirigez votre utilisateur directement vers une page aspx. Si tout ce que vous voulez faire est de modifier la mise en page de la page, l'implémenter comme sa propre action/vue et utiliser this overload pour View() qui prend une page maître en tant qu'argument.

1

Il est probablement plus facile de placer la forme de connexion dans une vue partielle. Ensuite, créez deux pages distinctes, chacune d'elles appelant une page maquette/mise en page différente. Dans chacune de ces pages, appelez Html.RenderPartial ("LogonForm").

(URL rewriting est généralement inutile dans MVC Use routes à la place..)

+0

Ceci est la façon dont je vais maintenant ... Maintenant, je suis capable de faire http: // localhost: 8020/Home/AlternateLogOn mais comment serais-je en mesure de répondre à la demande de l'utilisateur de charger cette page en appelant http: //localhost:8020/AlternateLogOn.aspx Ma page se trouve dans le dossier Views/Home de ma couche Web. – tom

Questions connexes