2010-10-25 7 views
13

Je cherche la meilleure méthode pour créer un modèle d'éditeur de liste déroulant avec MVC. Il semble y avoir plusieurs méthodes mais je ne trouve pas de méthode qui soit la meilleure, tout le monde semble le faire différemment. J'utilise MVC3 avec Razor, donc une méthode qui fonctionne avec ceci est préférée.Modèle d'éditeur ASP.NET MVC DropDown

Répondre

20

Il y a plusieurs façons et de dire qui est le mieux serait subjectif et pourrait ne pas fonctionner dans votre scénario qui, par la façon dont vous avez oublié de décrire dans votre question. Voici comment je le fais:

Modèle:

public class MyViewModel 
{ 
    public string SelectedItem { get; set; } 
    public IEnumerable<Item> Items { get; set; } 
} 

public class Item 
{ 
    public string Value { get; set; } 
    public string Text { get; set; } 
} 

Controller:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel 
     { 
      // TODO: Fetch this from a repository 
      Items = new[] 
      { 
       new Item { Value = "1", Text = "item 1" }, 
       new Item { Value = "2", Text = "item 2" }, 
       new Item { Value = "3", Text = "item 3" }, 
      } 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      // redisplay the view to fix validation errors 
      return View(model); 
     } 

     // TODO: The model is valid here => 
     // perform some action using the model.SelectedItem 
     // and redirect to a success page informing the user 
     // that everything went fine 
     return RedirectToAction("Success"); 
    } 
} 

Voir (~/Views/Home/Index.cshtml):

@model MyApp.Models.MyViewModel 

@{ Html.BeginForm(); } 
    @Html.EditorForModel() 
    <input type="submit" value="OK" /> 
@{ Html.EndForm(); } 

modèle Editeur (~/Views/Home/EditorTemplates/MyViewModel.cshtml):

@model MyApp.Models.MyViewModel 

@Html.DropDownListFor(x => x.SelectedItem, 
    new SelectList(Model.Items, "Value", "Text")) 
+0

Merci pour cela, il semble être exactement ce que je veux. – Craig

+1

Merci Darin. Mais le modèle d'éditeur n'a qu'une seule action (afficher la liste déroulante). Comment pouvez-vous simplement appeler le EditotFormModel()? Que dois-je faire si j'ai besoin de deux modèles d'éditeur, un pour la liste déroulante et l'autre pour la liste des cases à cocher? les deux je veux utiliser int la même vue? – Shyju

1

Personnellement, je pense que les éléments de la liste doivent être placés dans les données de vue pas le modèle de vue, mais cela dépend vraiment si vous affichez un menu déroulant qui ne change jamais (à l'aide des données d'affichage) ou si vous devrez le modifier dynamiquement (en utilisant un modèle de vue).

Dans l'exemple que vous envoyez des messages du même point de vue modèle à l'action de l'indice. L'action d'index est uniquement intéressée par l'élément sélectionné, donc il suffit de changer le paramètre de l'action d'index post à être sélectionné. De cette façon, le classeur du modèle examinera les paramètres du formulaire et remplira le paramètre d'index pour vous.

, je pense aussi qu'il serait préférable de passer une liste de SelectedListItems vers le bas à la vue de cette façon vous pas besoin de convertion et aurait pas besoin de la classe d'objet.

4

Ceci est mon approche de ce poste:

One EditorTemplate for all DropDownLists in ASP.Net MVC

+0

J'aime cette solution, mais il pourrait être un peu les boîtiers de Direct plus, comme l'utilisation de 'DependencyResolver' au lieu de' Activator' instancier –

+0

En fait, je fait de nombreuses améliorations, mais je me sens trop paresseux pour mettre à jour l'article :) Peut-être Je vais en faire un nouveau alors je t'ai dit :) –