2009-09-02 6 views
2

Je suis coincé, qui peut m'aider? Dans mon Logon.aspx Voir j'ai des contrôles de connexion (nom d'utilisateur, mot de passe, rememberme) à l'intérieur d'une balise FORM:Asp.NET MVC Ajax-Poster un formulaire et Ajax-Get

<form id="loginform" method="post" action="/Account/LogOn/"> 

Ci-dessous, j'ai un DIV caché avec un dropdownlist OPTION et une confirmation bouton, avec un onclick_event:

$.ajaxSetup({ cache: false }); 
$.ajax({ 
    type: "GET", 
    url: "/Account/SetCompanyAndContinue", 
    data: "{ 'id' : '1'}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json" 
}); 

Tout d'abord, l'utilisateur se connecte dans jQuery, je posterai les informations de connexion via AJAX:.

var loginCred = new Object(); 
loginCred.Username = $('#userName').val(); 
loginCred.Password = $('#password').val(); 
loginCred.RememberMe = $('#rememberMe').checked; 

var myJsonObject = JSON.stringify(loginCred); 

$.ajaxSetup({ cache: false }); 
$.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    url: "/Account/LogOnAjax/", 
    data: myJsonObject, 
    dataType: "json", 
    success: function(data) { 
     PostCredentialsSuccess(data); 
    } 
}); 

Ce POST fonctionne parfaitement. Le point d'arrêt de l'action du contrôleur est atteint par le débogueur et renvoie un objet de données JSON. J'ai mis ces données JSON dans la liste déroulante OPTION. Cette option Dropdownlist est ensuite présentée à l'utilisateur. Ensuite, lorsque l'utilisateur clique sur le confirmer bouton, un second appel AJAX est fait:

$.ajaxSetup({ cache: false }); 
$.ajax({ 
    type: "GET", 
    url: "/Account/SetCompanyAndContinue", 
    data: "{ 'id' : '1'}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json" 
}); 

Je suppose que l'action du contrôleur nommé « SetCompanyAndContinue » est touché:

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult SetCompanyAndContinue(string id) 
    { 
     SessionAdapter.CustomerID = Convert.ToInt32(id); 
     return null; 
    } 

Mais il ain' t passe, au contraire, la valeur par défaut action Controller get a frappé la première fois: (!)

public ActionResult LogOn() 
    { 
     return View(); 
    } 

, mais la deuxième fois que je clique (le même) bouton confirmer l'action Controller frappe enfin [SetCompanyAndCon continuer]. Est-ce que quelqu'un peut me dire ce que je fais mal? Merci d'avance.

+0

Comment lier le bouton de confirmation? – karim79

Répondre

0

erreur stupide de ma part:

  • J'ai ajouté un cookie au flux de réponse qui fait imprévisible se comportent de la webbrower.
  • J'ai oublié de marquer celui-ci comme étant
0

essayez d'utiliser un lien pour soumettre au lieu d'un bouton d'envoi normal, il a probablement un conflit quelque part entre le clic, ajax et le formulaire.

0

Je ne savais pas si j'avais les bonnes informations. Mais selon votre description tout clic sur le bouton "soumettre" va essayer de faire la méthode "Post" et non la méthode "Get". L'appel "Get" est effectué uniquement lorsque vous visitez la page au premier abord ou actualisez l'URL. Utilisez le bouton de lien pour faire l'action "Get".

C'est pourquoi dans votre exemple, il appelle "/ Account/LogOnAjax /" cette action avec la méthode "Post".

2

vous avez besoin de transférer la propriété de données comme un objet javascript non pas comme une chaîne

$.ajax({ type: "GET", 
    url: "/Account/SetCompanyAndContinue", 
    data: ({id : 1}), 
    contentType: "application/json; charset=utf-8", 
    dataType: "json" }); 

Je recommande d'utiliser Firebug pour regarder la requête HTTP réelle qui ne s'envoyer de jQuery, cette façon de petites erreurs comme cela devient évident très rapidement.

HTH

0

Pour comparer les différentes requêtes GET vous pouvez utiliser un proxy HTTP de débogage comme Fiddler ou Charles.

0

marc.d avait raison

Une règle générale (au moins ça marche pour moi): si votre action n'est pas frappé comme vous vous attendez, il est probablement quelque chose ne va pas avec votre params itinéraire ou si vous passez à la route par défaut, les données de formulaire envoyées avec le poste n'est pas ce qui est attendu. J'utilisais $ (ceci).serialize() comme un argument de données JQuery pour un $ post et un de mes champs de formulaire masqués était vide. L'action, qui n'était incluse dans aucune route, (je la laissais tomber à travers le défaut dans ce cas), n'a jamais vu le poste.