2009-10-14 6 views
1

J'ai une vue pour créer un nouveau compte dans mon application. Cette vue commence par Html.BeginForm() et frappe le bon contrôleur (Create) sans problèmes.MVC 1.0 Ajax.BeginForm() soumettre à l'intérieur d'un Html.BeginForm()

J'ai décidé d'ajouter un Ajax.BeginForm() afin que je puisse m'assurer qu'un compte avec le même nom n'existe pas déjà dans mon application.

Lorsque je clique sur le bouton Soumettre à l'aide de l'un ou l'autre bouton, il passe au même contrôleur (Créer). Pour essayer de différencier le bouton de soumission qui a été cliqué, je mets une vérification pour voir si la requête est Ajax alors essayez d'exécuter un chemin de code différent. Mais Request.IsAjaxRequest() ne tire pas. Quel est mon meilleur pari pour implémenter cette fonctionnalité dans un formulaire existant avec MS Ajax?

<% using (Html.BeginForm()) {%> 
      .............. 
    <% using(Ajax.BeginForm("Echo", 
    new AjaxOptions() { UpdateTargetId = "EchoTarget" })) 
    { %>  
    Echo the following text: 
    <%=Html.TextBox("echo", null, new { size = 40 })%> 
    <input type="submit" value="Echo" /> 
    <% } %> 
    <div id="EchoTarget"> 
code du contrôleur

:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(User newUser) 
    { 
     if (Request.IsAjaxRequest()) 
     { 
      return Content("*you hit the ajax button"); 
     } 
     else 
     { //regular create code here..... 
     } 
    </div> 

Répondre

2

Si vous insistez sur la forme multiple usage..use Javascript dans une certaine fonction comme celui-ci

<SCRIPT> 
    function InnerFormSubmitter(dataForm, actionForm) { 
    actionForm.innerHTML = dataForm.innerHTML; 
    actionForm.submit();  
} 
</SCRIPT> 

<form name="yourButton" action="ValidateSomething" method="post"></form> 

<form name="mainForm" action="SavedData" method="post"> 
<input type="textbox" name="text1"> 
<input type="textbox" name="text2"> 
<button name="validateUserButton" id="FormButton" onChange= 
"InnerFormSubmitter (this.form, document.getElementById('yourButton'))"> 

</button> 
    </form> 

Hope this helps!

Addendum sur l'utilisation jQuery pour votre scénario:

Depuis que vous vouliez un lien:

<a href="javascript:isValidUser(<%=Model.USerId%>);">Check Availability</a> 


function isValidUser(userId) { 
var url = "<CONTROLLER>/<ACTION>/" + userId; 
$.post(url, function(data) { 
    if (data) { 
     // callback to show valid user 
    } else { 
     // callback to show error/permission 
    } 
}); 
} 

Et vous contrôleur devriez avoir:

[AcceptVerbs("POST")] 
public bool IsValidUser(int id) { 
// check availability 
bool allow = CheckUser(); 

// if allow then insert 
if (allow) { 
    //insert user 

    return true; 
} else { 
    return false; 
} 
} 

supplémentaire sur jQuery:

Au lieu de

document.getElementById('UserIdent').value 

vous pouvez utiliser

$('#UserIdent').val(); 

Mise à jour sur l'utilisation JSON

La classe JsonResult doit être utilisé dans le contrôleur et $.getJson fonction dans la vue.

$(function() { 
    $('#yourLinkOrButton').click(function() { 
     $.getJSON("<CONTROLLER>/GetUserAvailability/", null, function(data) { 
      $("#yourDivorLablel").<yourFunctionToUpdateDiv>(data); 
     }); 
    }); 

    public JsonResult GetUserAvailability() 
    { 
     //do all validation and retrieval 
     //return JsonResult type 

    } 
+0

Vous pouvez également explorer la possibilité d'utiliser des Iframes. http://ajaxpatterns.org/IFrame_Call –

+1

Les formulaires multiples ne sont vraiment pas un problème. Il ne s'agit que de les imbriquer, ce qui n'est jamais vraiment nécessaire.Si vous avez recours à JS, vous pouvez aussi concocter directement un POST au lieu d'utiliser un formulaire HTML. –

+0

La solution élégante consommée est d'utiliser le mécanisme de demande JSON après avoir accroché jQuerypowerhorse au chariot MVC! –

2

Vous ne pouvez pas les formes de nid, jamais, dans une page HTML, peu importe la façon dont vous créez la forme. Ce n'est pas un code HTML valide et les navigateurs ne peuvent pas le gérer correctement. Vous devez faire les formes frères et sœurs plutôt que des enfants.

+0

Oui, cela le corrige. Merci pour la clarification! Maintenant, mon problème d'origine reste, comment puis-je mettre un bouton à l'intérieur de ce premier formulaire qui peut fonctionner et exécuter un contrôleur sans publication? – Mouffette

+0

Vous pouvez le faire avec JavaScript. (C'est-à-dire, un bouton avec un gestionnaire onclick.) Ou vous pouvez mettre les formes les unes à côté des autres au lieu d'une dans l'autre. –

+0

Ou un positionnement absolu du vaudou pour faire tomber la forme b à l'intérieur du formulaire a. –

Questions connexes