none
DropDownlistFor in MVC 3 RRS feed

  • Frage

  • Hallo

    ich habe ein Problem und weiß nicht wie ich es lösen könnte. Vielleicht könnt ihr mir helfen.

    Ich habe angefangen einen MVC 3 Projekt in Razor View Engine zu erstellen.

    Ich habe einen Model:

    public class HandysModel
    {
        private List<SelectListItem> _herstellerListe = new List<SelectListItem>();
        private List<SelectListItem> _handyListe = new List<SelectListItem>();
    
        [Required(ErrorMessage = "Bitte ein Hersteller auswählen")]
        public string SelectedHersteller { get; set; }
    
        [Required(ErrorMessage = "Bitte ein Handy auswählen")]
        public string SelectedHandy { get; set; }
    
        public List<SelectListItem> HerstellerListe
        {
          get
          {
            List<IShopItemHersteller> hersteller_Liste = getHerstellerListeForMVC();
    
            foreach (var item in hersteller_Liste)
            {
              _herstellerListe.Add(new SelectListItem() { Text = item.Name, Value = item.ID.ToString() });
            }
    
            return _herstellerListe;
          }
        }
    
        public List<SelectListItem> HandyListe
        {
          get
          {
            if (_handyListe.Count() == 0)
            {
              List<HandyCoreShopItem> handys = getHandys();
              foreach (var item in handys)
              {
                _handyListe.Add(new SelectListItem() { Text = item.HandyName, Value = item.HandyId.ToString() });
              }
            }
    
            return _handyListe;
          }
          set
          {
            _handyListe = value;
          }
        }
    
    }
    

    Im Controller habe ich dann zwei Action Methoden

    public class HandysController : Controller
    {
    
        [HttpGet]
        public ActionResult Index()
        {
          return View(new HandysModel());
        }
        
        [HttpPost]
        public ActionResult AlleHandys(HandysModel model)
        {
          string herstellerSelectedValue = model.SelectedHersteller;
          if (model.HandyListe.Count > 0)
          {
            model.HandyListe.Clear();
          }
          var items = (from h in model.getHandys()
                 where h.HerstellerId.ToString() == herstellerSelectedValue
                 select new SelectListItem() { Text = h.HandyName, Value = h.HandyId.ToString() }).ToList();
          
          model.HandyListe = items;
          return View(model);
          
        }
    

    und das view sieht dann so aus:

     

    @model Base_MVC3.Models.HandysModel
          
    <div class="box handyspager">
    
      
      @Html.DropDownListFor(x => x.SelectedHersteller, new SelectList(Model.HerstellerListe, "Value", "Text") ,)
      @Html.ValidationMessageFor(x => x.SelectedHersteller)
      @Html.DropDownListFor(x => x.SelectedHandy, new SelectList(Model.HandyListe, "Value", "Text"))
      @Html.ValidationMessageFor(x => x.SelectedHandy)
      
    
    
    </div>
    

     

    Meine Frage jetzt: Ich möchte wenn ich ein Element aus der 1.DropdownListe also einen Hersteller auswähle alle zugehörigen Handys in die Liste einfügen aber diese ohne PostBack zu erzeugen also das ein AJAX aufruf stattfindet. Wie kann ich dies realisieren. Mit einem Button funktioniert es wunderbar kann ich es auch ohne Button realisieren.

     

    viele Grüße und Danke i.V.

    Dienstag, 31. Mai 2011 12:00

Antworten

  • Hallo Tolga1979,

    AJAX-Request kannst du sehr komfortabel mit der JavaScript-Library jQuery absetzen. In deinem konkreten Fall würde es sich anbieten die Funktion $.post() aufzurufen, sobald der Wert des ersten DropDown verändert wurde. Als Parameter nimmt die Funktion eine URL (zu einer Action eines Controllers) und ein Json-Objekt entgegen.

    Hier mal ein kleines Beispiel:

    Javascript

     

     $.post("@Url.Action("GetByManufacturer")", { manufacturer: $("#HERSTELLER_DROPDOWN_ID").val() }, function (data) {
      // anderes DropDown mit den Werten aus dem erhaltenen data-Objekt füllen.
     });
    

     

    Controller

     

    [HttpPost]
    public ActionResult GetByManufacturer(string manufacturer)
    {
     return Json(/* gefilterte Liste zurückgeben */);
    }
    

     

     

    Damit solltest du meiner Meinung nach erstmal weiterkommen.

     

    Gruß,
    Philip 



    • Als Antwort markiert Tolga1979 Freitag, 3. Juni 2011 07:37
    Dienstag, 31. Mai 2011 12:25