web-dev-qa-db-fra.com

Liste déroulante ASP.NET MVC de la base de données

Ok, donc je suis nouveau dans tout ce monde MVC, mais cela semble être un assez bon moyen de faire avancer les choses et j'essaie de le faire fonctionner ici.

Le problème est: je ne peux pas obtenir les données de ma table dans ma base de données SQL vers un simple formulaire déroulant sur ma page d'inscription.

Je n'ai aucune idée où mettre les trucs, où coder pour ouvrir la table, sélectionner les identifiants, où mettre le response.write et comment l'envoyer à la vue?

Mon modèle est le suivant:

    public class users
{
    public string name {get; set;}
    public int user_id {get; set;}
}

Mon contrôleur est le suivant:

    [HttpGet]
    public ActionResult ListUser()
    {
        return View();
    }

Et ma vue est la suivante:

@model Community.Models.users

J'ai googlé pendant 2 jours maintenant et regardé plusieurs vidéos sur youtube, mais inutile, je ne le trouve pas. S'il vous plaît, quelqu'un avec des connaissances ici? Et s'il vous plaît, dirigez-moi vers de bons tutoriels et/ou forums où je peux parcourir pour plus de questions que je pourrais avoir


Toujours pas de chance sur ce projet ..

Je crée un formulaire et dans ce formulaire, je veux une boucle db (IEnumerable) .. Mais le modèle actuel n'est pas un IEnumerable. Je suis à peu près coincé, j'ai regardé un tas de tutoriels et ils listent tous UNE connexion, et si je veux deux modèles?

Voici mon contrôleur, je comprends que vous devez passer une liste à la vue, non?

    public ActionResult Registration()
    {
        return View(db.users.ToList());
    }

Comment puis-je obtenir cette liste dans ma vue sans un modèle IEnumerable?

@neoistheone, votre exemple ne m'a pas beaucoup aidé, ma base de données s'ouvre comme ceci:

private DataBaseContext db = new DataBaseContext();

et je ne sais pas comment, mais cela ouvre la connexion. J'ai essayé pendant tant d'heures maintenant, c'est juste idiot, je n'ai pas dormi si longtemps!

Je suis habitué à programmer ASP-Classic fyi, et c'est ma première tentative sérieuse de mettre à niveau mes connaissances sur la programmation d'un langage à jour et de la POO.

15
Tobias

Ajoutez le SelectList à votre modèle:

public SelectList DropDownList { get; set; }

construire la classe pour cette collection:

public class MyListTable
{
    public string Key { get; set; }
    public string Display { get; set; }
}

puis dans votre contrôleur, chargez les données de la classe MyListTable à partir de la base de données:

var list = new List<MyListTable>();

using (SqlConnection c = new SqlConnection(cString))
using (SqlCommand cmd = new SqlCommand("SELECT KeyField, DisplayField FROM Table", c))
{
    using (SqlDataReader rdr = cmd.ExecuteReader())
    {
        while (rdr.Read())
        {
            list.Add(new MyListTable
            {
                Key = rdr.GetString(0),
                Display = rdr.GetString(1)
            });
        }
    }
}

var model = new users();
model.DropDownList = new SelectList(list, "Key", "Display");

et enfin, vous devez envoyer votre modèle à la vue:

return View(model);

Maintenant, dans le rasoir, vous pouvez afficher ceci:

@Html.DropDownListFor(m => Model.DropDownList);

Vous pouvez bien sûr nommer ces choses de meilleurs noms, mais vous avez l'idée.

21
Mike Perrenoud

Il y a déjà de bonnes réponses mais voici une autre approche.

Vous utiliserez user comme modèle, ListUserViewModel comme modèle d'affichage et UserController comme contrôleur. Le travail de view-model consiste à transporter toutes les informations nécessaires pour être affichées sur la page à partir du contrôleur sans ajouter de propriétés indésirables dans la classe de modèle. Dans votre cas, liste des utilisateurs de la base de données dans la liste déroulante.

Modèle:

public class User     //By the way use singular when naming a class
{
    public string name {get; set;}
    public int user_id {get; set;}
}

Modèle de vue

public class ListUserViewModel
{
    public list<User> Users{get; set;}
}

Manette

public class UserController : Controller
{
    private DataBaseContext db = new DataBaseContext();

    [HttpGet]
    public ActionResult ListUser()
    {
        var users = db.Users.ToList();

        var viewModel = new ListUserViewModel { Users = users };

        return View(viewModel);
    }
}

Utilisez maintenant ListUserViewModel au lieu de User dans votre vue en tant que modèle

@model Community.Models.ListUserViewModel

et le menu déroulant

@Html.DropDownListFor(m => m.Users, new SelectList(Model.Users, "user_id", "name"), " ")

Explication:

Vous créez une liste déroulante pour les utilisateurs avec Model.Users comme source de données de liste de sélection. "user_id" comme valeur de l'utilisateur sélectionné et "name" comme étiquette d'affichage. le dernier argument (j'ai mis une chaîne vide " ") est une valeur par défaut que la liste déroulante affichera avant la sélection.

J'espère que cela vous aidera, vous ou quelqu'un d'autre.

8
AIM

Essaye ça,

modèle

public string CoutryID { get; set; }
public List<SelectListItem> CountryList { get; set; }

Méthode du contrôleur qui remplit la liste

public List<Country> getCountryList()
        {
            using (QRMG_VendorPortalDataContext _context = new QRMG_VendorPortalDataContext())
            {
                return (from c in _context.Countries
                        where c.IsDeleted == false
                        select c).ToList();
            }
        }

Liste déroulante dans la vue

 @Html.DropDownListFor(m => m.CoutryID,
         new SelectList(Model.CountryList,
                        "CoutryID", "Value"))
5
Jeet Bhatt
3
Tobias

Je trouve que ce système fonctionne (et évite d'utiliser ViewBag):

Voir le modèle:

public class YourViewModel
{
    // This could be string, int or Guid depending on what you need as the value
    public int YourDropdownSelectedValue { get; set; }
    public IEnumerable<SelectListItem> YourDropdownList { get; set; }
}

Contrôleur:

// Get database values (by whatever selection method is appropriate)
var dbValues = db.YourEntity.ToList();

// Make Selectlist, which is IEnumerable<SelectListItem>
var yourDropdownList = new SelectList(dbValues.Select(item => new SelectListItem
{
    Text = item.YourSelectedDbText,
    Value = item.YourSelectedDbValue
}).ToList(), "Value", "Text");

// Assign the Selectlist to the View Model   
var viewModel = new YourViewModel(){
    // Optional: if you want a pre-selected value - remove this for no pre-selected value
    YourDropdownSelectedValue = dbValues.FirstOrDefault(),
    // The Dropdownlist values
    YourDropdownList = yourDropdownList
};

// return View with View Model
return View(viewModel);

et dans la vue:

@Html.DropDownListFor(a => a.YourDropdownSelectedValue, Model.YourDropdownList, "select this text - change this to null to exclude", new { @class = "your-class" })
3
RickL

c'est ma table dans la base de données

enter image description here

regardez-le mon contrôleur d'action

    // GET: Letters
    public ActionResult Index()
    {
        ViewBag.LetterStatus = new SelectList(LetterStatusService.GetAllLettersStatus(), "Id", (CultureHelper.GetCurrentCulture() == "ar") ? "NameArabic" : "Name", Request.QueryString["LetterStatus"]);
        return View();
    }

et dans la vue

  @Html.DropDownList("LetterStatus")

le constructeur que j'ai utilisé est

new SelectList(
    list<Objlect> myListFromDatabase,
    string PropertyNameOfValueInHtml,
    string PropertyNameOfDesplayInHtml,
    string SelectedItemValue 
);

cette ligne Request.QueryString["LetterStatus"] car j'envoie les éléments sélectionnés dans QuerySrting

et basé sur CurrentCulture j'ai choisi la colonne à afficher

et le résultat est enter image description here

mais je pense que la meilleure façon de le faire , est d'obtenir ou de créer les éléments, puis de les réitérer pour générer manuellement la balise de sélection. J'ai bien décrit cette approche dans cette réponse

j'espère que cela vous aide

2
Basheer AL-MOMANI