J'ai un exemple d'application, essayant d'apprendre la validation de jQuery et de soumettre un formulaire dans ce scenerio.ASP.Net MVC 2 - Validation jQuery et formulaire Submit - DataAnnotations
La page comporte une zone de texte (EnvelopeID par enveloppe de classe). Si vous cliquez sur le bouton Soumettre et que la zone de texte est vide, je veux afficher un message d'erreur. Si ce n'est pas vide, je veux envoyer une requête ajax à GetData Action. L'action renvoie des vues partielles (valeur 1 ou 2) ou une chaîne d'erreur.
Problème:
- validation du client ne se produit pas ici.
- Comment puis-je faire
$(form).submit
pour adhérer à la validation de jquery et ne pas publier les données si elles sont vides? Je peux vérifier que la zone de texte est vide ou non avant de poster (manuellement) mais je veux utiliser la bonne façon.
Ce même exemple fonctionne avec MSAjax et la validation sans aucun problème.
Page Master Chef
<script type="text/javascript" src="<%= Url.Content("~/Scripts/jquery-1.4.1.min.js") %>"></script>
<script type="text/javascript" src="<%= Url.Content("~/Scripts/jquery.validate.min.js") %>"></script>
<script type="text/javascript" src="<%= Url.Content("~/Scripts/MicrosoftMvcJQueryValidation.js") %>"></script>
Classe:
namespace PartialViews.Models
{
public class Envelope
{
[Required(ErrorMessage="Envelope ID is required!")]
public string EnvelopeID { get; set; }
}
}
Action données:
[HttpPost]
public ActionResult GetData(Envelope envelope)
{
ActionResult result = null;
if (ModelState.IsValid)
{
Information myInfo = newInformation();
if (envelope.EnvelopeID == "1")
{
result = View("TQ1PV", myInfo); //partial view
}
elseif (envelope.EnvelopeID == "2")
{
result = View("TQ2PV", myInfo); //partial view
}
else
{
result = Content("Error");
}
}
else
{
result = View("index", envelope);
}
return result;
}
Action Index:
public Action Result Index()
{
return View();
}
JS sur View - Index
<script type="text/javascript">
$(function() {
//onload
$("#evid").focus();
$("form[name='EVIDForm']").submit(function() {
var action = $(this).attr('action');
var evid = $("#evid").val();
var tdata = $(this).serialize();
alert(tdata);
$message = $("#resultDiv");
$message.html('').removeClass("red");
$.ajax({
cache: false,
type: "post",
url: action,
data: tdata,
dataType: "html",
error: function (xhr, ajaxOptions, thrownError){
alert('system error');
},
success: function(data){
if (data == 'Error')
$message.html("No such EV ID found!").addClass("red");
else
$message.html(data);
}
});
return false;
});
});
</script>
HTML sur View - Index:
<% Html.EnableClientValidation(); %>
<%= Html.ValidationSummary() %>
<% using (Html.BeginForm("GetData", "Info", FormMethod.Post, new {name = "EVIDForm" }))
{%>
<%= Html.LabelFor(model => model.EnvelopeID) %>
<%= Html.TextBoxFor(model => model.EnvelopeID, new { maxlength = "8"})%>
<%= Html.ValidationMessageFor(model => model.EnvelopeID,"*") %>
<br /><br />
Correct EVIDs are 1 and 2. All other entries will result in an error.
<br /><br />
<input type="submit" value="submit" />
<%} %>
<div id="resultDiv" style="margin-top: 20px;"></div>
Merci
J'ai presque le même problème que décrit dans la poster que @vandalo lié. Il semble que la validation du client ne fonctionne pas sans soumettre le formulaire. Mais si je dois soumettre le formulaire, la validation n'est plus du côté client ... Je n'ai pas reçu de réponse à ma question ici: 'http://stackoverflow.com/questions/4172319/inline-client-side-validation -with-mvc-and-jquery/' – Lorenzo
@Lorenzo: le formulaire n'est pas envoyé. Vous pouvez essayer de définir un point d'arrêt dans le contrôleur recevant le message. Cela ne se déclenchera jamais. Le seul problème est (seulement la première fois, jusqu'à ce que vous ne cliquiez pas sur le bouton) la validation côté client ne semble pas se déclencher dès le début. – LeftyX
@vandalo: Si vous utilisez fiddler ou firebug, vous pouvez voir le soumettre au serveur – Lorenzo