2010-07-09 2 views
0

Je travaille actuellement avec MVC 1.0 et n'ai jamais travaillé avec AJAX auparavant et n'ai qu'une expérience limitée (commencé il y a un peu plus d'une semaine) avec ASP.Net MVC . J'essaye d'installer une table (qui est construite/est dans une vue partielle) qui est remplie avec l'information d'une base de données qui permet à un utilisateur d'ajouter rapidement des enregistrements pr remove dans ou depuis la base de données directement depuis la table. J'essaie d'utiliser AJAX pour y arriver car il y a beaucoup d'autres informations sur le reste de la page que je ne veux pas avoir à recharger. Voici un modèle rapide.MVC Ajax ne charge pas Vue partielle dans div, chargement nouvelle page

row1: (zone de texte) Ajouter

row2: Name1 Retirer

row3: Nom2 Retirer

Ainsi, lorsqu'un utilisateur veut, ils peuvent entrer un nom dans la (zone de texte) touche Ajouter et une action dans le contrôleur ajoutera le nom entré dans la base de données et rechargera la vue partielle avec les informations les plus à jour. Jusqu'à présent, j'ai pu appeler la méthode d'action et ajouter l'enregistrement dans la base de données. Le problème est qu'il ne recharge pas JUST la vue partielle. Il charge à la place la vue partielle en tant que nouvelle page entière et son contenu est le seul qui s'affiche. (Au lieu de rester à/Projet/Détails/5, la page se charge/Projet/MembersDisplay)

Dans ma page principale je:

<script src="<%= Links.Scripts.jquery_1_3_2_min_js %>" type="text/javascript"></script> 
<script src="<%= Links.Scripts.MicrosoftAjax_js %>" type="text/javascript"></script> 
<script src="<%= Links.Scripts.MicrosoftMvcAjax_js %>" type="text/javascript"></script> 

Dans le contrôleur je:

[AcceptVerbs(HttpVerbs.Post)] 
    public virtual ActionResult AddMember(FormCollection form) 
    { 
     MemberRepository repo = new MemberRepository(); 
     Member m = new Member(); 
     m.Id = Convert.ToInt32(form["Id"]); 
     m.Name = form["name"]; 

     try{ 
      repo.addMember(m); 
      repo.save(); 
     } 
     catch{ 
      return View(); 
     } 

     // Make a new IList of All Members in this current 
     //IList<Member> mems = (new PRDataContext()).Members_GetMembersById(m.Id).ToList<Member>(); 

     return View("MembersDisplay", members); 
    } 

la vue partielle est

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<List<Application.Models.Member>>" %> 
<script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script> 
<script src="/Scripts/MicrosoffMvcAjax.js" type="text/javascript"></script> 
<table> 
    <% if (Model.Count() > 0) { %> 
     <% foreach (var p in ViewData.Model) { %> 
    <tr> 
     <td><%= Html.Encode(p.Name) %></td> 
     <td><%= Ajax.ActionLink("Delete", "AjaxDelete", new { p.Id, p.Name }, new AjaxOptions { Confirm = "Delete?", HttpMethod = "AjaxDelete", UpdateTargetId = "results" })%></td> 
    </tr> 
     <% } %> 
    <% } else { %> 
    <tr> 
     <td><b>There are no Members.</b></td> 
    </tr> 
    <% } %> 
</table> 

Dans le contrôleur, j'ai essayé d'ajouter si (Request.IsA jaxRequest() == true) la branche n'a jamais été exécutée. Je ne suis pas sûr si ajax ne charge pas, ou ce que je fais mal.

EDIT - code manquant Ajout

Voici la partie de détails qui utilise la vue partielle:

<table> 
<% Ajax.BeginForm("AddMember", "Project", new AjaxOptions { UpdateTargetId = "results", InsertionMode=InsertionMode.Replace}) { %> 
<tr> 
    <td align="left" colspan="2" style="background-color:#93B6E0;"><font style="color:#fff;"><b>Members</b></font></td> 
</tr> 
<tr> 
    <td width="80%"> 
     <input type="hidden" name="prjId" value="<%= Html.Encode(Model.Id) %>" /><input type="text" name="name" style="width:120px;" /> 
    </td> 
    <td width="20%"> 
     <input type="submit" value="Add" /> 
    </td> 
</tr> 
<% } %> 
<tr> 
    <td colspan="2"> 
     <div id="results"><% Html.RenderPartial(MVC.Members.Views.MembersDisplay, Model.Members.ToList<Member>()); %></div> 
    </td> 
</tr> 

+0

Il semble que vous exécutiez une publication au lieu d'une requête POST ajax. Pouvez-vous partager le code qui appelle votre action de contrôleur? – Tahbaza

+0

Voir la question mise à jour. – Dirk

+0

L'a corrigé. Entre autres, les liens vers les fichiers .js étaient erronés (merci à FireBug de le signaler). – Dirk

Répondre

0

J'ai mis à niveau vers MVC 2.0 comme @RailRhoad suggéré.

Puis j'ai déplacé la vue partielle à une zone et doit changer les liens de chemin vers les fichiers .js pour être plus explicite (T4MVC ne restituait pas les chemins corrects). Au lieu de

<script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script>

ou

<script src="<%= Links.Scripts.MicrosoftAjax_js %>" type="text/javascript"></script>

je devais faire

<script src="../../../../Scripts/MicrosoftAjax.js" type="text/javascript"></script>

En outre, l'action dans le contrôleur travaillé comme suggéré par

@ Jim
return PartialView(MVC.ProjectDash.Project.Views.MembersDisplay, members); 

En outre, j'ai enlevé le « InsertionMode = ... » de

<% Ajax.BeginForm("AddMember", "Project", new AjaxOptions { UpdateTargetId = "results", InsertionMode=InsertionMode.Replace}) { %> 

Le plus gros problème était les fichiers javascript ne sont pas être liés et correctement référencées. Une fois que cela a été réparé, les autres choses se sentent rapidement en place.

1

Dirk - pas sûr si le code complet est là. Cependant, d'un bref coup d'œil, votre retour:

return View("MembersDisplay", members); 

quand en fait, pour une vue partielle, vous devriez retourner quelque chose comme:

return PartialView("MembersDisplay", members); 

espérons que cette aide

jim

+1

Je l'ai modifié et j'ai essayé un type de retour ActionResult et PartialView, et aucun n'a fonctionné. Il charge tout le partiel dans la fenêtre et rien d'autre. – Dirk

1

Si vous souhaitez envoyer le fichier Ajax.BeginForm, vous devez l'inclure dans le formulaire avec des accolades. Actuellement, votre soumission ne figure pas dans le formulaire.

+0

En outre, vous voudrez probablement envisager de mettre à niveau vers MVC 2.0 – RailRhoad

+0

Changé le code pour inclure {} s et mettre le bouton de soumission avec les {} s, mais il est encore en train de tout charger dans la fenêtre et non la div. – Dirk

Questions connexes