2010-04-16 5 views
10

J'utilise jQuery.load() pour afficher une vue partielle. Cette partie ressemble à ceci:ASP.NET MVC 2 chargement partiel vue en utilisant jQuery - aucune validation côté client

$('#sizeAddHolder').load(
       '/MyController/MyAction', function() { ... }); 

Le code pour des actions dans mon contrôleur est le suivant:

public ActionResult MyAction(byte id) 
    { 
     var model = new MyModel 
     { 
      ObjectProp1 = "Some text" 
     }; 

     return View(model); 
    } 

    [HttpPost] 
    public ActionResult MyAction(byte id, FormCollection form) 
    { 
     // TODO: DB insert logic goes here 

     var result = ...; 

     return Json(result); 
    } 

Je retournais une vue partielle qui ressemble à ceci:

<% using (Html.BeginForm("MyAction", "MyController")) {%> 
    <%= Html.ValidationSummary(true) %> 

    <h3>Create my object</h3> 

    <fieldset> 
     <legend>Fields</legend> 

     <div class="editor-label"> 
      <%= Html.LabelFor(model => model.ObjectProp1) %> 
     </div> 
     <div class="editor-field"> 
      <%= Html.TextBoxFor(model => model.Size.ObjectProp1) %> 
      <%= Html.ValidationMessageFor(model => model.ObjectProp1) %> 
     </div> 

     div class="editor-label"> 
      <%= Html.LabelFor(model => model.ObjectProp2) %> 
     </div> 
     <div class="editor-field"> 
      <%= Html.TextBoxFor(model => model.ObjectProp2) %> 
      <%= Html.ValidationMessageFor(model => model.ObjectProp2) %> 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 

<% } %> 

La validation côté client ne fonctionne pas dans ce cas. De plus, le script qui contient des messages de validation n'est pas inclus dans la vue qui est retournée. Les deux propriétés de ma classe de modèle ont les attributs Required et StringLength. Y at-il un moyen de déclencher la validation côté client dans une vue qui a été chargée comme ça?

Répondre

7

Tout d'abord vous devriez retourner une vue partielle et non une vue. Deuxièmement, essayez-vous de charger cette vue partielle avec AJAX? Dans ce cas, vous pouvez utiliser jquery.ajax

function ajax_update(path) 
    $.ajax { 
    url: path, 
    success: function(result) { 
     $('#sizeAddHolder').html(result); 
    } 
    return false; 
} 
+2

Nous vous remercions d'informations précieuses. J'ai corrigé ces erreurs mais cela ne fait pas vraiment de différence. Le html rendu est exactement le même dans les deux cas puisque 'load()' obtient le html de la même façon que 'ajax()' utilise XMLHttpRequest et 'renvoie View (model)' s'il n'y a pas SomeAction.aspx rend SomeAction.ascx . Jetez un oeil ici: http://stackoverflow.com/questions/2043394/what-is-the-difference-between-a-view-and-a-partialview-in-asp-net-mvc Donc le problème principal est toujours là: pas de validation côté client; aucun code contenant des messages de validation .. –

+1

Le code ci-dessus ne résout pas le problème original –

+1

il peut renvoyer une vue aussi, cela n'a pas vraiment d'importance tant que la vue qu'il renvoie n'utilise pas la même page maître que celle où il s'appelle – Omu

2

Vous devez utiliser dataType sur l'appel ajax

function ajax_update(path) 
    $.ajax { 
    url: path, 
    dataType: "html", 
    success: function(result) { 
     $('#sizeAddHolder').html(result); 
    } 
    return false; 
} 

De jQuery docs:

dataType Par défaut: Devinez intelligent (xml, JSON, le script ou html)

Type de données que vous attendez du serveur. Si aucun n'est spécifié, jQuery essayera intelligemment d'obtenir les résultats, en fonction du type MIME de la réponse (un type XML MIME produira du XML, dans 1.4 JSON donnera un objet JavaScript, dans 1.4 script exécutera le script, et tout sinon sera renvoyé sous forme de chaîne). Les types disponibles (et le résultat passé comme premier argument à votre rappel de succès) sont:

* "xml": Returns a XML document that can be processed via jQuery. 
* "html": Returns HTML as plain text; included script tags are evaluated when inserted in the DOM. 
* "script": Evaluates the response as JavaScript and returns it as plain text. Disables caching unless option "cache" is used. Note: This will turn POSTs into GETs for remote-domain requests. 
* "json": Evaluates the response as JSON and returns a JavaScript object. In jQuery 1.4 the JSON data is parsed in a strict manner; any malformed JSON is rejected and a parse error is thrown. (See json.org for more information on proper JSON formatting.) 
* "jsonp": Loads in a JSON block using JSONP. Will add an extra "?callback=?" to the end of your URL to specify the callback. 
* "text": A plain text string. 
+0

Merci pour cette info. Le truc c'est que dans un cas je voudrais retourner html (quand les données passées n'étaient pas valides - puisque la validation côté client échoue ..) donc l'utilisateur peut faire des changements et les poster à nouveau. Mais lorsque les données validées et un nouvel objet dans la base de données a été créé avec succès, je voudrais retourner Json. Est-il possible de vérifier le type de résultat retourné? –

+0

Essayez de définir le type de réponse MIME: * Si aucun n'est spécifié, jQuery essayera intelligemment d'obtenir les résultats, en fonction du type MIME de la réponse. * –

+0

Je crois que c'est le comportement par défaut et "si aucun n'est spécifié" dans ce cas, signifie "si vous ne le définissez pas explicitement" plutôt que "ne le définissez pas". – bszom

1

Le problème est que le formulaire chargé avec ajax n'est jamais enregistré avec la validation Microsoft. Pour le résoudre, appelez la fonction suivante Sys.Mvc.FormContext._Application_Load.

function ajax_update(path) 
    $.ajax { 
    url: path, 
    success: function(result) { 
     $('#sizeAddHolder').html(result); 
     Sys.Mvc.FormContext._Application_Load(); 
    } 
    return false; 
} 

Cela devrait le réparer. Assurez-vous également que les formulaires que vous chargez via ajax possèdent des identifiants uniques. Sinon, la validation échouera.

Évitez d'utiliser load(). Il supprime tous les scripts chargés dans la réponse.

0

Dans le fichier HTML, vous pouvez avoir quelque chose comme:

désolé mais je ne Nô pas comment poster un lien html.Ainsi, vous pouvez avoir un lien classe = "supprimer", id = valeur et un href = "javascript :;"

J'ai ensuite utilisé cette fonction pour rendre une vue partielle:

$(".delete").click(function(event){ 
      var id = $(".select").attr("id"); 
      var id2 = event.target.id; 
      $.ajax({ 
       url: "Persona/Delete?idPersona=" + id2.toString(), 
       success: function (data) { 
        $("#popUpConfirmar").html(data); 
       } 
      }); 

      dialogoPopUp.dialog("open"); 
     }); 

Rappelez-vous dans le controleur, vous devez avoir une action comme:

public PartialViewResult Delete(int idPersona) 
    { 
     PersonaDataAccess personaDataAccess = new PersonaDataAccess(); 
     Persona persona = personaDataAccess.GetOne(idPersona); 
     return PartialView("Delete",persona); 
    } 
Questions connexes