2009-12-17 6 views
1

j'ai le contrôle LogOn.ascx qui se trouve à la page principale Site.master:ASP.Net MVC: Problèmes avec PartialView

<% Html.RenderPartial("LogOn"); %> 

Cette commande contient formulaire email et mot de passe textboxed qui est soumis à LoginController:

public class LoginController : Controller 
{ 
    ... 
    [HttpPost] 
    public ActionResult Login(string email, string password) 
    { 
     if (this.userRepository.ExistByEmail(email) && 
      this.authenticationService.IsPasswordMatches(email, password)) 
     { 
      var user = this.userRepository.GetByEmail(email); 
      this.userSession.LogIn(user); 
      return PartialView("LogOn", user); 
     } 
     return PartialView("LogOn"); 
    } 
} 

donc, si l'utilisateur est authentifié je passe avec succès l'utilisateur dans le modèle de vue partielle LogOn (simplifié):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Core.Model.User>" %> 
<%= this.Model.FirstName %> 

J'ai 2 problèmes avec ce code:

  1. Après avoir appelé return PartialView("LogOn") je reçois exception « Le IControllerFactory « UI.Services.ControllerFactory » n'a pas retourné un contrôleur pour le nom« default.aspx » Cette question est résolu en ajoutant un routage pour "default.aspx". Mais pourquoi la requête va à "default.aspx" quand j'appelle return PartialView(..)? (J'utilise le serveur web VS)

  2. Je reçois exception de référence null dans LogOn.ascx même si l'utilisateur a été authentifié avec succès et la valeur non nulle a été adoptée en PartialView sur la ligne suivante:

Quelqu'un a-t-il une idée de la raison pour laquelle l'utilisateur n'est pas passé dans LogOn.ascx? Merci

Répondre

0

Je suppose que votre formulaire de connexion fait une soumission standard au serveur (c'est-à-dire l'envoi de la page entière) plutôt qu'un poste AJAX?

Si tel est le cas, le résultat de l'action de l'action de connexion devrait être une vue entière, pas partielle -. Il n'y a pas de page d'accueillir la partie en

À la suite de ce que vous avez ajouté un itinéraire par défaut maintenant, vous n'êtes pas passer en fait l'objet utilisateur à la partie que vous appelez de la page:

<% Html.RenderPartial("LogOn"); %> 

vous auriez besoin d'être appeler cela avec l'utilisateur, ce qui voudrait dire que vous avez besoin ajouter l'utilisateur à ViewData ou aux modèles que vous transmettez si vous n'utilisez pas de fournisseurs d'appartenance. Je suppose que vous effectuez des vérifications dans le journal LogOn partiel pour vérifier si la requête est authentifiée autrement que pour vérifier si l'objet User a été transmis - car la plupart de vos appels à ce partiel proviendront du maître page qui ne passe pas dans l'objet Utilisateur, celles-ci échoueront pour la plupart.

+0

Ben, merci de répondre. Vous avez raison - c'est un appel non-ajax et dans LogOn.ascx il y a une vérification pour déterminer si la requête courante est authentifiée (je l'ai désinsérée dans l'exemple). Je commence avec MVC pour que je puisse mal comprendre certains concepts. J'ai donc changé 'return PartialView ("LogOn", utilisateur)' on 'return Voir ("LogOn", utilisateur)' - le même résultat. Je n'ai pas compris ce que vous pensiez de "Vous devriez appeler <% Html.RenderPartial (" LogOn ");%> avec l'utilisateur". Je pensais que View partage son ViewData et son modèle avec une vue partielle imbriquée (si la vue partielle n'a pas ses propres données d'affichage explicitement transmises). Ou je me trompe? – alex

Questions connexes