2010-03-26 7 views
1

Je passe mon temps à contourner ce problème. Je ai récemment posé cette question Create/Edit/Save data in a jQuery pop-up for ASP.NET-MVC and Linq2Sql Je suis sûr que la réponse est la bonne façon de procéder, mais je ne peux pas comprendre comment écrire le code back-end pour le faire fonctionner. J'ai d'abord fait mon site en suivant le tutoriel nerddinner. J'ai un modèle de sous-traitance et un contrôleur de sous-traitance. Sur ma page d'accueil de sous-traitance, j'aimerais qu'il y ait une boîte de dialogue/boîte de dialogue dans laquelle l'utilisateur peut entrer dans une nouvelle société si la société ne figure pas déjà dans la liste déroulante. Dois-je créer un nouveau contrôleur d'entreprise? Je n'aurais pas de modèle d'entreprise b/c la table d'entreprise est liée à ma table de sous-traitance au sein de la sous-traitance dbml.Création d'un nouvel enregistrement à l'aide d'AJAX dans ASP.NET-MVC

Quelqu'un peut-il me diriger vers un exemple quelque part? Ou offrir de l'aide. Lorsque la méthode company/create est appelée, tous les champs sont NULL.

EDIT: Lorsque la méthode company/create est appelée, tous les champs sont NULL.

Voici le code:

<div id="popupCreateCompany" title="Create a new company"> 
    <p> 
     <label for="company_name">Company Name:</label><br /> 
     <%= Html.TextBox("company_name") %>  
    </p> 
    <p> 
     <label for="company_desc">Company Description:</label><br /> 
     <%= Html.TextBox("company_desc") %> 
    </p> 
    <p> 
     <label for="address">Address:</label><br /> 
     <%= Html.TextBox("address") %> 
    </p> 
    <p> 
     <label for="city">City:</label><br /> 
     <%= Html.TextBox("city") %> 
    </p> 
    <p> 
     <label for="state">State:</label><br /> 
     <%= Html.TextBox("state") %> 
    </p> 
    <p> 
     <label for="zip">Zip:</label><br /> 
     <%= Html.TextBox("zip") %> 
    </p> 
    <p> 
     <label for="website">Website:</label><br /> 
     <%= Html.TextBox("website") %> 
    </p> 
</div> 

Code jquery:

  $("#create-company").click(function() { 
      //centerPopup(); 
      //loadPopup(); 
      $('#popupCreateCompany').dialog(
       { 
        modal: true, 
        buttons: 
        { 
         'Add': function() { 
          var dialog = $(this); 
          var form = $(this).find('#popupCreateCompany'); 
          $.post('/company/create', $(form).serialize(), function() { 
           dialog.dialog('destroy'); 
          }) 
         }, 
         'Cancel': function() { 
          dialog.dialog('destroy'); 
         } 
        } 
       }); 

     }); 

Aussi, mes champs apparaissent comme une boîte séparée qui est au-dessus de la boîte de dialogue. alt text http://i39.tinypic.com/2hhg4kh.jpg

+0

Créé une nouvelle question pour mon problème d'affichage ici: http://stackoverflow.com/questions/2535718/display-issue-with-jquery-dialog-form-shows-as-separate-window – RememberME

Répondre

3

Vous n'avez pas besoin de créer un nouveau contrôleur. Soumettre un formulaire via jQuery n'est vraiment pas différent de soumettre un formulaire en cliquant sur un bouton avec la souris.

Le code de la réponse précédente:

$.post('/company/new', $(form).serialize(), function() { 
          dialog.dialog('destroy'); 
         } 

va afficher tous les domaines de votre formulaire dans une requête POST, comme d'habitude. Si vous nommez vos champs de formulaire tels qu'ils représentent les propriétés d'un objet, et peut donc être lié à un objet de modèle comme d'habitude, vous pouvez créer votre méthode d'action comme normale:

public ActionResult New(CompanyDetails newCompany) 
{ 
    if (ModelState.IsValid) 
    { 
     // Insert newCompany into database. 
    } 
} 

Vous pouvez aussi utiliser un FormCollection paramètre et TryUpdateModel() pour un objet que vous créez:

public ActionResult New(FormCollection postedValues) 
{ 
    // Create a new Company() here and just call TryUpdateModel() on it: 
    var company = new Company(); 
    TryUpdateModel(company); 
    if (ModelState.IsValid) 
    { 
     /// Insert 
    } 
} 

Si pour une raison quelconque vos champs de formulaire ne peuvent pas correspondre à des propriétés d'objet, vous pouvez alors prendre le chemin « manuel », et juste chercher le FormCollection paramètre pour les données de terrain dont vous avez besoin, et faites votre logique métier pour construire une nouvelle société avec les valeurs affichées. Une fois que vous avez fini de créer votre entreprise, vous devez vous rappeler que la méthode d'action a été appelée via ajax, et que c'est un callback jQuery qui va gérer la réponse. Vous souhaiterez peut-être renvoyer un JsonResult qui indique simplement le succès ou l'échec et fermez simplement la boîte de dialogue ou renvoyez une vue complète que le rappel jQuery gérera en tant que données html et affichera dans la boîte de dialogue.

+0

Merci. Cela a aidé à envelopper ma tête autour d'un peu. Je suis nouveau sur le web, MVC, jQuery, Ajax, tout. J'ai l'impression de "l'avoir" et ensuite un nouveau concept me lance. Je serai de retour après que je lui donne un autre essai. – RememberME

+0

Bonne chance! Il peut certainement être écrasant de garder tout droit au premier abord. – womp

+0

Ajout de code et problèmes ci-dessus. Merci! – RememberME

2

L'URL que j'ai utilisée dans ma réponse à votre question précédente n'était qu'un exemple. Vous pouvez tout aussi bien avoir une méthode sur le contrôleur existant qui crée une nouvelle société. Quant à ne pas avoir un «modèle» d'entreprise, je dirais que vous en avez déjà un. C'est dans le même contexte de données que votre sous-contrat - peut-être que vous voulez dire que vous n'avez pas de référentiel d'entreprise. En fonction de la façon dont vous avez structuré votre référentiel, vous pouvez avoir besoin d'un référentiel distinct pour le modèle de société.Si vous utilisez un référentiel par modèle de modèle (référentiel fortement typé), vous souhaitez un référentiel distinct lorsque vous traitez directement avec des sociétés. Si vous utilisez plusieurs modèles par modèle de référentiel (méthodes fortement typées), vous n'avez probablement pas besoin d'un autre modèle.

En tout état de cause, vous avez besoin une méthode sur certains contrôleur pour gérer la création de l'entreprise. J'irais probablement avec un contrôleur de compagnie séparé puisque vous voudrez peut-être aussi avoir la capacité de créer de nouvelles compagnies à l'avance sans respecter aucun contrat particulier. Uinsg un contrôleur séparé va séparer la logique pour les manipuler conduisant à moins de couplage avec vos classes de sous-traitance si vous avez éventuellement besoin de développer l'application.

+0

Merci. J'ai posté ici seulement parce que l'autre question devenait vieille. Je serai de retour après que je lui donne un autre essai. – RememberME

+0

J'ai ajouté du code ci-dessus. Merci! – RememberME

+1

Vous n'avez pas de formulaire dans la boîte de dialogue. Je pense que la méthode serialize() nécessite un ou plusieurs éléments de formulaire comme paramètre. Essayez d'utiliser: 'var form = $ (this) .find ('input: text');' – tvanfosson

Questions connexes