2009-11-06 4 views
2

En utilisant l'exemple de catalogue Auteurs/Livres, disons que je veux éditer les informations pour les livres d'un auteur spécifique.ASP.NET MVC newbie: obtenir/transmettre des données sous forme de liste déroulante pour plusieurs objets dans une édition Voir

Lorsque quelqu'un accède à domain.com/Books/Edit/2, je veux afficher une vue d'édition pour tous les livres où Author_ID = 2. Parmi les différentes informations de livre, il y a la catégorie de livre (fiction, non-fiction, manuel, peu importe) Ces catégories sont dans leur propre table et sont référencées par un Category_ID.

Quelle est la meilleure façon de configurer le formulaire d'édition?

Actuellement mon contrôleur j'ai quelque chose comme ceci:

public ActionResult Edit(int id) 
     { 

      IQueryable<Book> books = bookRepository.FindBooksForAuthor(id); 
      return View(books); 
     } 

Et à mon avis partielle:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IQueryable<Authors.Models.Book>>" %> 

    <%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %> 

    <% using (Html.BeginForm()) {%> 

     <fieldset> 
      <legend>Fields</legend> 
      <%var i = 0; 
       foreach (var book in Model) 
       {%> 



      <p> 
       <label for="Category_ID">Category_ID:</label> 
       <%= Html.TextBox("Category_ID", book.Category_ID)%> 
       <%= Html.ValidationMessage("Category_ID", "*")%> 
      </p> 
      <p> 
       <label for="Description">Description:</label> 
       <%= Html.TextBox("Description", book.Description)%> 
       <%= Html.ValidationMessage("Description", "*")%> 
      </p> 

      <%i++; 
       } %> 
       <p> 
       <input type="submit" value="Save" /> 
      </p> 
     </fieldset> 

    <% } %> 

est mon Inherits correctement réglé en haut de la vue depuis que je suis de passage un objet IQueryable? Plus important encore, comment puis-je obtenir le champ Category_ID pour être un DropDown avec la catégorie correcte sélectionnée? Puis-je simplement envoyer les données pour la liste déroulante à la vue et comprendre l'élément sélectionné au niveau de la vue?

ViewData["categories"] = new SelectList(_db.BookCategories.ToList().OrderBy(b => b.Category_Title), "Category_ID", "Category_Title"); 

Répondre

0

Vous pouvez créer vue liste contenant classe modèle de livres et liste de sélection des catégories:

public class BooksEditViewModel 
{ 
    public IQueryable<Authors.Models.Book> Books { get; set; } 
    public IQueryable<BookCategory> BookCategories { get; set; } 
} 

Ensuite, utilisez BooksEditViewModel comme modèle de vue

System.Web.Mvc.ViewUserControl<BooksEditViewModel> 

et menu déroulant code avec

Html.DropDownList("Category_ID", new SelectList(Model.BookCategories,"Category_ID", "Category_Title",book.Category_ID); 

Vous devriez également lire sur la liste de liaison:

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

+1

Ce lien est un _bit_ obsolète; Par exemple, vous n'avez pas besoin d'index caché. Celui-ci est meilleur: http://marcomagdy.com/2009/09/03/asp-net-mvc-model-binding-form-inputs-to-action-parameters/ – queen3

+0

Bon à savoir. Merci pour les précisions supplémentaires. – LukLed

+0

Merci! Comme je l'ai mentionné, tout cela est nouveau pour moi. Je n'étais pas au courant du concept "ViewModel". Vous m'avez mis sur le bon chemin, j'ai dû google un peu et trouvé ceci, qui a tout exposé pour moi: http://stephenwalther.com/blog/archive/2009/04/13/asp.net-mvc- tip-50-ndash-create-view-models.aspx Merci. – johnnycakes

Questions connexes