2013-09-04 14 views
11

Ok, quindi sono nuovo di tutto questo mondo MVC, ma sembra essere un buon modo per fare le cose e sto cercando di farlo funzionare qui.ASP.NET MVC dropdown-list dal database

Il problema è: Non riesco a ottenere i dati dalla mia tabella nel mio database SQL in un semplice modulo a discesa sulla mia pagina di registrazione.

Non ho idea di dove mettere le cose, dove digitare il codice per aprire la tabella, selezionare gli id, dove mettere il response.write e come posso inviarlo alla vista?

Il mio modello è questo:

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

mio Controller è questo:

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

E la mia opinione è questa:

@model Community.Models.users 

Googled per 2 giorni e guardato diversi video su youtube ma inutili, non riesco a trovarlo. Per favore, qualcuno con qualche conoscenza qui? E per favore mi punto ad alcuni buoni tutorial e/o forum dove posso cercare ulteriori domande potrei avere


Ancora nessuna fortuna a questo progetto ..

Sto creando un form e all'interno di tale modulo, voglio un db-loop (IEnumerable) .. Ma il modello attuale non è un IEnumerable. Sono praticamente bloccato, ho visto un sacco di tutorial e tutti elencano solo UNA connessione, e se volessi due modelli?

Ecco il mio controller, ho capito che è necessario passare una lista alla vista, giusto?

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

Come posso entrare in possesso di quella lista, a mio avviso witout un modello IEnumerable?

@neoistheone, il tuo esempio non mi ha aiutato molto, il mio DB apre in questo modo:

private DataBaseContext db = new DataBaseContext(); 

e io non so come, ma si apre la connessione. Ho provato per così tante ore ora, è solo sciocco, non ho dormito per così tanto tempo!

Sono abituato a programmare ASP-Classic fyi e questo è il mio primo tentativo serio di aggiornare le mie conoscenze sulla programmazione di un linguaggio aggiornato e OOP.

+1

Controlla qui: http://stackoverflow.com/questions/2396883/asp-net-mvc-populate-a-drop-down-list e qui: http://stackoverflow.com/questions/314933/ asp-net-mvc-how-do-i-pass-a-list-da-una-classe-in-modello-a-un-ripetitore-in-a-vie –

+1

Controlla http://stackoverflow.com/a/10018406/1241400 –

risposta

16

Aggiungere il SelectList al modello:

public SelectList DropDownList { get; set; } 

costruire la classe per quella collezione:

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

e poi nel vostro controller, caricare i dati per la classe MyListTable dal database:

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"); 

e quindi, infine, è necessario inviare il modello t o la vista:

return View(model); 

Ora, nel rasoio è possibile visualizzare questo:

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

È ovviamente possibile fare nomi queste cose migliori, ma si ottiene l'idea.

+1

Sembra buono, solo, la mia connessione al database è simile a questa: using (var db = new communityContext()), e non ho idea di come "SELECT * FROM ......" – Tobias

+1

@Tobias, non è necessario connettersi al database nello stesso modo in cui lo faccio. Ti sto solo dando un esempio. Non sarai in grado di copiare e incollare questa soluzione, dovrai ovviamente installarla, non sto scrivendo il tuo software - ti sto solo aiutando con questo problema - quindi non c'è modo che il codice sarà solo ** adatta. ** –

+1

@Tobias, allo stesso modo in cui ottieni tutte le righe da qualsiasi tabella usando un 'DbContext'. Si accede alla proprietà che è disponibile per quella tabella. Come ho detto, devi adattarlo. Potresti riuscire a sbarazzarti della classe 'MyListTable' perché hai un' DbContext'. È possibile inviare un 'Elenco' di quelli nella classe' SelectList' e utilizzare diversi campi chiave e di visualizzazione. Cerca le API e imparale, comprendile a livello astratto. –

4

Prova questo,

modello

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

metodo di controllo che riempiono la lista

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

elenco a discesa in vista

@Html.DropDownListFor(m => m.CoutryID, 
     new SelectList(Model.CountryList, 
         "CoutryID", "Value")) 
3
2

questa è la mia tabella nel database

enter image description here

prendere cercarlo mio controller azione

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

e nella vista

@Html.DropDownList("LetterStatus") 

il costruttore che ho usato è

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

questa linea Request.QueryString["LetterStatus"] perché io mando gli elementi selezionati all'interno QuerySrting

e basato o n CurrentCulture Ho scelto quale colonna per visualizzare

e il risultato sono enter image description here

ma penso che il modo migliore per farlo è quello di ottenere ,,,, o creare gli elementi poi Iterate gettare loro di generare il tag select manualmente. Ho descritto questo approccio bene in this answer

speranza che questo ti aiuta

5
Ci

un grande risposte già, ma qui è un altro approccio.

Si utilizzerà user come modello, ListUserViewModel come modello di vista e UserController come controller. Il lavoro di view-model è di portare tutte le informazioni necessarie per essere visualizzate sulla pagina dal controller senza aggiungere proprietà indesiderate nella classe del modello. Nel tuo caso l'elenco degli utenti dal database nell'elenco a discesa.

Modello:

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

View-modello

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

controller

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); 
    } 
} 

Ora usano ListUserViewModel invece che l'utente nella vista come un modello

@model Community.Models.ListUserViewModel 

e il menu a discesa

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

Spiegazione:

Si sta creando a discesa per gli utenti con Model.Users come Seleziona origine elenco di dati."user_id" come valore dell'utente selezionato e "name" come etichetta di visualizzazione. l'ultimo argomento (ho messo la stringa vuota " ") è un valore predefinito che il menu a tendina verrà visualizzato prima della selezione.

Spero che questo possa aiutare te o qualcun altro.

0

Trovo che questo sistema funziona (e evita di usare ViewBag):

Vista Modello:

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; } 
} 

Controller:

// 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); 

e nella vista:

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