2011-06-23 3 views
0

Mon affichage est rempli avec les propriétés du modèle et certains de la liste déroulante sont codés en dur et sont passés à viewdata, Le problème est Trupdatemodel ne met à jour que les valeurs du modèle, je ne peux pas mettre à jour , Voici le code qui met à jour le modèle, mais pas la liste déroulante viedata:Comment mettre à jour ViewData en utilisant TrypUpdateModel dans mvc2

Vue:

<div class="editor-field"> 
        <% if (ViewBag.mode != "edit") 
         { %> 
        <%: Html.TextBoxFor(model => model.Date)%> 
        <%}else{%> 
         <%: Html.TextBoxFor(model => model.Date, new { @Value = Model.Date.ToShortDateString() })%> 
        <%} %> 
        <%: Html.ValidationMessageFor(model => model.Date) %> 
       </div></td></tr><tr><td>Experience level</td><td><div class="editor-field"> 
        <%: Html.DropDownListFor(model => model.ExperienceLevelID, (SelectList)ViewData["Experience"], "--select--")%> 
        <%: Html.ValidationMessageFor(model => model.ExperienceLevelID) %> 
       </div></td></tr> 

       <tr><td>No of Attendees</td><td><div class="editor-field"> 

       <%-- <%: Html.DropDownList("attendees1", (SelectList)ViewData["attendees1"], "--select--")%>--%> 
       <% if (ViewBag.mode != "edit") 
        { %> 

       <%: Html.DropDownList("attendees1", ViewData["attendees1"] as SelectList, "--select--")%> 
       <%}else{%> 
       <%: Html.DropDownList("attendees1")%> 
       <%} %> 
       &nbsp;&nbsp; <label>£</label>&nbsp;<%: Html.TextBox("attendeeCost", ViewData["txtAttendees"], new { maxlength = "5", style = "width:40px;" })%> <label>Price/Unit</label> 
       </div></td></tr> 

       <tr><td>Second Driver</td><td> <div class="editor-field"> 

        <label>£</label>&nbsp;<%: Html.TextBoxFor(model => model.SecondDriverPrice, new { maxlength = "5", style = "width:40px;" })%> <label>Price</label> 
        &nbsp;&nbsp; <%: Html.CheckBoxFor(model => model.SecondDriver) %><label>Free</label> 
       </div></td></tr> 

       <tr><td>No of Helmets</td><td><div class="editor-field"> 
       <% if (ViewBag.mode != "edit") 
        { %> 
       <%: Html.DropDownList("helmets", ViewData["size"] as SelectList, "--select--")%> 
       <%}else{%> 
       <%: Html.DropDownList("helmets", "--select--")%> 
       <%} %> 
       &nbsp;&nbsp; <label>£</label>&nbsp;<%: Html.TextBox("unitCosthelmet", ViewData["txtHelmet"], new { maxlength = "5", style = "width:40px;" })%> <label>Price/Unit</label> 
       </div></td></tr> 

Controller:

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


     ViewBag.mode = "edit"; 

     // for dropdown track 
     ITrackRepository trackResp = new TrackRepository(); 
     IQueryable<Object> tracks = trackResp.GetVenuesSelectlist(); 
     ViewData["Venue"] = new SelectList(tracks, "VenueID", "Name"); 

     // for dropdown for event type 
     ITrackdayRepository trackdayResp = new TrackdayRepository(); 
     IQueryable<EventType> eventTypes = trackdayResp.GetAllEventTypes(); 
     ViewData["EventTypes"] = new SelectList(eventTypes, "ID", "Name"); 

     // for dropdown experience 
     IExperienceLevelRepository expLevelResp = new ExperienceLevelRepository(); 
     IQueryable<ExperienceLevel> expLevel = expLevelResp.GetAllExperienceLevels().OrderBy(ExperienceLevel => ExperienceLevel.Name); 
     ViewData["Experience"] = new SelectList(expLevel, "ID", "Name"); 

     // dropdown for helmets 
     IProductRepository helmetResp = new ProductRepository(); 
     Product productHelmet = helmetResp.GetProd(id); 

     var attendeesList = Enumerable.Range(1, 80).Select(x => new SelectListItem { Value = x.ToString(), Text = x.ToString() }); 
     ViewData["attendees1"] = new SelectList(attendeesList.ToList(), "Value", "Text"); 


     // dropdown for helmets 
     var helmetsList = Enumerable.Range(1, 200).Select(x => new SelectListItem { Value = x.ToString(), Text = x.ToString() }); 
     ViewData["helmets"] = new SelectList(helmetsList.ToList(), "Value", "Text"); 

     //ViewBag.helmet = new SelectList(helmets.ToList(), "Value", "Text", product.QtyAvailable); 

     // dropdown for garages 
     var garagesList = Enumerable.Range(1, 50).Select(x => new SelectListItem { Value = x.ToString(), Text = x.ToString() }); 
     ViewData["garages"] = new SelectList(garagesList.ToList(), "Value", "Text"); 

     Event trackday = trackdayResp.GetEvent(id); 

     TryUpdateModel(trackday, collection); 


     if (ModelState.IsValid) 
     { 
      // product.DateModified = DateTime.Now; 
      trackday.DateModified = DateTime.Now; 
      TempData["msg"] = trackdayResp.Save().ToString(); 
      helmetResp.Save(); 
      return RedirectToAction("Index"); 
     } 
     else 
     { 
      return View("Create"); 
     } 


    } 
+1

Comme son nom l'indique, TryUpdateModel met à jour le modèle s'il le peut. ViewData est seulement nécessaire pour la vue et pas besoin de le mettre à jour –

+0

Quelle est votre question? – Lazarus

+0

J'ai besoin de mettre à jour la liste sélectionnée dans mon menu d'édition qui est rempli par les données de vue –

Répondre

1

Vous devez disposer des données que vous souhaitez mettre à jour dans un modèle pour TryUpdateModel pour mettre à jour ces valeurs. Si vous les placez dans ViewData, les données ne seront transmises qu'à la vue et le contrôleur n'a aucun moyen de les mettre à jour en utilisant TryUpdateModel.

Vous devez inclure les données de liste de sélection qui se trouvent actuellement dans votre ViewData dans l'objet Event ou créer un objet qui inclura les valeurs que vous souhaitez mettre à jour. Ensuite, en utilisant TryUpdateModel mettra à jour ces données avec les valeurs affichées. Lorsque vous créez ce nouvel objet ou l'ajoutez à Event, tapez fortement votre vue sur cet objet afin de ne pas avoir besoin d'effectuer des conversions ViewData dans la vue.

+0

Donnez-moi un exemple .. J'ai essayé de faire un modèle de vue de type personnalisé pour tous les downlist codés dur mais échoué lamentablement :( –

Questions connexes