2017-08-01 1 views
1

Toute aide pour comprendre pourquoi mon champ n'est pas mis à jour en Mvc et comment résoudre ce problème?Pourquoi mon champ n'est pas mis à jour en Mvc avec EditorFor?

Ceci est mon contrôleur:

public class RestaurantController : Controller 
{ 
     static List<RestaurantModel> rr = new List<RestaurantModel>() 
     { 
      new RestaurantModel() { Id = 1, Name = "Kebabs", Location = "TX" }, 
      new RestaurantModel() { Id = 2, Name = "Flying Donoughts", Location = "NY" } 
     }; 
     public ActionResult Index() 
     { 
      var model = from r in rr 
       orderby r.Name 
       select r; 
      return View(model); 
     } 
     public ActionResult Edit(int id) 
     { 
      var rev = rr.Single(r => r.Id == id); 
      return View(rev); 
     } 
} 

Puis, quand j'accéder à/restaurant/index, je ne peux évidemment voir une liste de tous les restaurants parce que je Index.cshtml:

@model IEnumerable<DCForum.Models.RestaurantModel> 

    @foreach (var i in Model) 
    { 
     @Html.DisplayFor(myitem => i.Name) 
     @Html.DisplayFor(myitem => i.Location) 
     @Html.ActionLink("Edit", "Edit", new { id = i.Id }) 

    } 

et quand je clique sur le lien Modifier, ce point de vue est déclenchée (Edit.cshtml):

@model DCForum.Models.RestaurantModel 
      @using(Html.BeginForm()) { 
       @Html.ValidationSummary(true) 

       <fieldset> 
        @Html.HiddenFor(x => x.Id) 
        @Html.EditorFor(x => x.Name) 
        @Html.ValidationMessageFor(x => x.Name) 

        <input type="submit" value="Save" /> 
       </fieldset> 
      } 

Je cliquant sur le s ave mais la valeur que j'entre pour Name n'est pas enregistrée quand je retourne à l'index. Qu'est-ce que j'oublie ici? C'est assez évident qu'il me manque quelque chose. Comment puis-je faire la mise à jour?

PS. Serait-il plus recommandable de le faire d'une manière plus directe, peut-être sans utiliser les aides et juste associer une méthode de mise à jour avec le bouton de sauvegarde? (parle juste).

+0

Est-ce que cliquer sur "Enregistrer" sur votre page d'édition fait quoi que ce soit? Je ne vois aucun code pour réellement mettre à jour quoi que ce soit. – Becuzz

+1

@Becuzz N'a pas besoin de. OP a enveloppé la logique dans "BeginForm", a probablement besoin de passer dans les paramètres et/ou "Id" pour localiser le contrôleur/méthode. Je n'utilise généralement pas BeginForm ... mais plutôt deviner. - https://msdn.microsoft.com/fr-fr/library/system.web.mvc.html.formextensions.beginform(v=vs.118).aspx –

+0

Vous n'avez pas de 'ActionMethod' pour recevoir le Données "POST". Il devrait ressembler à quelque chose comme '[HttpPost] public ActionResult Edit (restaurant RestaurantModel)' –

Répondre

0

J'avais oublié d'ajouter la méthode HttpPost. Merci beaucoup à tous d'avoir signalé cela.

[HttpPost] 
     public ActionResult Edit(int id, FormCollection collection) 
     { 

      var review = rr.Single(r => r.Id == id); 
      if (TryUpdateModel(review)) 
      { 
       return RedirectToAction("Index"); 
      } 
      return View(review); 
     } 
0

Vous avez un ActionResult pour l'action HttpGet, mais rien à recevoir l'action HttpPost. Créer une nouvelle ActionResult avec le HttpPostAttribute là-dessus, et un argument qui correspond au modèle, comme ceci:

[HttpPost] 
public ActionResult Edit(Restaurant restaurant) 
{ 
    //Save restaurant here 

    return RedirectToAction("Index"); 
} 

Le ModelBinder va prendre cette place, et remplir restaurant pour vous de la forme qui a été soumis.