2016-11-30 1 views
1

Dans mon projet ASP.Net MVC je suit ViewModeldemande multiple ajax à partir d'une vue de rasoir ayant modèle IEnumerable/viewmodel

public class ApproveItemViewModel 
{ 
     [Required] 
     public int ItemId { get; set; } 

     [Required] 
     public string ItemCode { get; set; } 
} 

Je suivant deux méthodes dans le contrôleur

[HttpGet] 
    public ActionResult ListPendingItems() 
    { 
     var items = new List<ApproveItemViewModel>(); 
     //add few items here in above list 
     return View(vms); 
    } 

    [HttpPost] 
    public JsonResult ApproveItem(ApproveItemViewModel viewmodel) 
    { 
     return Json(new { success = success }, JsonRequestBehavior.AllowGet); 
    } 

Maintenant, dans mon rasoir voir ce que je veux est d'appeler la méthode ApporveItem en utilisant des appels Ajax pour chaque élément individuel. J'ai donc créé plusieurs formes ajax en utilisant le code ci-dessous.

@model IEnumerable<ApproveItemViewModel> 
@foreach (var item in Model) 
{ 
    using (Ajax.BeginForm("ApproveItem", new AjaxOptions() 
         { 
          InsertionMode = InsertionMode.Replace, 
          HttpMethod = "POST", 
          UpdateTargetId = "dane" 
         })) 
    { 
     @Html.AntiForgeryToken() 
     @Html.ValidationSummary(true) 

     <table> 
      <tr> 
       <td>@Html.LabelFor(m => item.ItemId)</td> 
       <td>@Html.DisplayFor(m => item.ItemId)</td> 
      </tr> 
      <tr> 
       <td>@Html.LabelFor(m => item.ItemCode)</td> 
       <td>@Html.TextBoxFor(m => item.ItemCode))</td> 
      </tr> 
      <tr> 
       <td><input type="submit" value="Approve" /></td> 
      </tr> 
     </table> 
    } 
} 

Cependant, dans le paramètre de méthode d'action du contrôleur I obtenir à la fois ItemId et ItemCode que respectivement 0 et null. Quel est le problème ici, quelqu'un pourrait-il vous aider s'il vous plaît? Comment pouvons-nous passer le viewmodel à l'action en utilisant ajax?

+0

Vous avez inclus le **@Html.AntiforgeryToken**, alors assurez-vous que votre demande contient le ** _ ** requestVarificationToken ainsi. –

+0

Vous voyez n'a aucun sens. Vous ne pouvez publier qu'un formulaire à la fois, alors pourquoi générez-vous un formulaire pour chaque article de votre collection? Le modèle dans votre vue est 'List ' donc la méthode POST doit être 'publique JsonResult ApproveItem (List viewmodel)' et vous générez les contrôles de formulaire dans une boucle 'for' ou' EditorTemplate' à l'intérieur d'un formulaire (un message de retour toutes les modifications à la fois) –

+0

Vous pouvez également générer le tableau en tant que texte et utiliser un formulaire modal pour modifier un élément sélectionné et le renvoyer à public JsonResult ApproveItem (ApproveItemViewModel viewmodel) 'Bien que votre méthode suggère tout ce que vous voulez faire 'Approuver' un article alors pourquoi l'utilisateur peut-il éditer les propriétés 'ItemId' et' ItemCode'? –

Répondre

0

Le problème est très probablement que le classeur de modèle dans la vue ne sait pas comment lier votre liste de ApproveItemViewModel.

Voir cette réponse pour une explication: https://stackoverflow.com/a/21191624/2521893

@model IEnumerable<ApproveItemViewModel> 
@for (int i = 0; i < Model.Count; i++) 
{ 
    using (Ajax.BeginForm("ApproveItem", new AjaxOptions() 
         { 
          InsertionMode = InsertionMode.Replace, 
          HttpMethod = "POST", 
          UpdateTargetId = "dane" 
         })) 
    { 
     @Html.AntiForgeryToken() 
     @Html.ValidationSummary(true) 

     <table> 
      <tr> 
       <td>@Html.LabelFor(m => Model[i].ItemId)</td> 
       <td>@Html.DisplayFor(m => Model[i].ItemId)</td> 
      </tr> 
      <tr> 
       <td>@Html.LabelFor(m => Model[i].ItemCode)</td> 
       <td>@Html.TextBoxFor(m => Model[i].ItemCode))</td> 
      </tr> 
      <tr> 
       <td><input type="submit" value="Approve" /></td> 
      </tr> 
     </table> 
    } 
} 
+0

Cela ne fonctionne pas. Le paramètre de la méthode POST doit être 'List ' et seul le premier formulaire liera (le 'DefaultModelBinder' exigera que les indexeurs de collection commencent à zéro et soient consécutifs) –

0

cause de ce problème est le nom 'paramètre'. Vous devez garder le même nom pour le paramètre action de l'action du contrôleur (c.-à-d. Viewmodel) et le modèle de l'itération (item) du côté cshtml, alors seule la liaison devrait se produire. Voir les deux solutions différentes ci-dessous.

Solution 1: Modifier la page cshtml: - Remplacer @foreach (var article dans le modèle) avec @foreach (var viewmodel dans le modèle) -à-dire,

@foreach (var viewmodel in Model) 

Solution 2: Modifier contrôleur action: - Change le nom du paramètre de l'action ApproveItem. -à-dire,

[HttpPost] 
public JsonResult ApproveItem(ApproveItemViewModel item) 
{ 
    return Json(new { success = success }, JsonRequestBehavior.AllowGet); 
}