2017-09-27 2 views
0

Mon modèle comme ci-dessous:MVC post Razor liste mise à jour

public class Product 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

Controller Index comme ci-dessous:

public ActionResult Index(int id) 
{ 
    return View(GetProducts()); //Get Product return List 
} 

contrôleur post Mon comme ci-dessous: Il est de retour liste complète affichait. Je n'ai besoin que de dossiers mis à jour.

public ActionResult Update(List<Prouct> Proucts) 
{ 

} 

Voir comme ci-dessous:

@model List<Product> 

@using (Html.BeginForm("Update", "Product", FormMethod.Post, new {Proucts=Model})) { 
for (var i = 0; i < Model.count(); i++) 
{ 
    @Html.HiddenFor(v => Model[i].Id) 
    @Html.TextBoxFor(m => Model[i].Name) 
    </div> 
    <button type="submit" title="Save"> 
} 

SO lors de la publication de retour afficherons liste complète (y compris la mise à jour). par exemple. s'il y a 100 produits, il en affiche 100. Même si j'ai changé 1 ou aucun. Je dois donc tout mettre à jour à nouveau.

Est-il possible de publier uniquement les enregistrements modifiés?

+3

Le formulaire va afficher tout ce qui est dans le formulaire. Vous pouvez dans votre logique côté serveur vérifier si les valeurs d'enregistrement affichées sont différentes des valeurs d'enregistrement stockées et ne les mettre à jour que si elles le sont. Mais cela peut être une opération tout aussi coûteuse, voire plus, que de simplement autoriser la mise à jour. Inversement, vous pouvez écrire beaucoup de JavaScript complexe pour suivre l'état et créer un post AJAX basé sur des enregistrements modifiés ou quelque chose comme ça. Le sacrifice là est la complexité du code. Est-ce que c'est vraiment un problème que les enregistrements soient mis à jour avec les mêmes valeurs? – David

+0

J'avais le même problème dans l'un des projets mais heureusement, j'utilisais knockout qui a une collection observable pour identifier les changements dans la collection. –

Répondre

0

Aucune fonctionnalité n'est fournie prête à l'emploi pour effectuer ce que vous voulez faire avec les pages Razor.

Votre meilleur pari est de faire un peu de code javascript pour détecter et afficher seulement le champ d'entrée qui ont changé sur le navigateur.

Une simple recherche par StackOverflow donnera quelques solutions possibles qui peuvent vous aider à atteindre cet objectif:

0

Je ne suis pas sûr dans le client côté (Jquery, Javascript) aiderait. Mais du côté du serveur, vous pouvez le faire dans votre mise à jour ActionResult Post mehtod (List Proucts) par ceci.

public ActionResult UpdatePerson(List<Person> Proucts) 
    { 
     var dbProductsList = GetProducts(); //Get Product List 
     foreach (var product in Proucts) 
     { 
      if (!dbProductsList.Where(x => x.Name == product.Name).Any()) 
      { 
       dbContext.Update(product); 
       dbContext.SaveChanges(); 
      } 
     } 
     return View(); 
    } 

Pour votre côté client, vous devriez opter pour Ajax.

+0

C'est bon aussi. Mais mon modèle est assez gros, j'ai donc besoin d'une solution côté client. Peut-être que je peux utiliser une sorte de grille plutôt que le rendu MVC – user2739418