Strano problema con ASP.NET MVC DropDownFor

Ciao,

Ho il seguente nel mio punto di vista:

<form id="list_ad" method="get" class="adListFilter" action="">  model.LS.L1, Model.LS.Location1List, "-- Place --", new { @class = "dd1" })%> ...  

model.LS.L1 è int? Model.LS.Location1List è SelectList (nessuna selezione imposta solo la lista)

La prima visita sulla vista apparirà grata, LocationDropDown conterrà valori corretti e il modello.LS.L1 sarà impostato su null.

Quindi invio il modulo e nell’azione di controllo imposterò il modello da LS.L1 a 3. Ho anche verificato che questo sia vero alla fine dell’azione (“return View (data);”).

Il problema è che l’opzione con valore 3 non è impostata come selezionata nel controllo a discesa? Il modello.LS.L1 sembra essere nullo anche quando era impostato su 3 nell’azione?

Quale può essere il problema?

I migliori saluti

Edit1:

Azione:

  public ActionResult List(AdList data) { AdModel adModel = new AdModel(); AccountModel accountModel = new AccountModel(); FilterModel filterModel = new FilterModel(); List adList; AdCategoryPreset adCategoryPreset = null; int adCount; if (data == null) data = new AdList(); adCategoryPreset = this.setDefaultPresets(data); this.setDefaultViewData(data, adCategoryPreset); this.SetDefaultSettingsOnListAdListSettings1(data.ALS); data.ALC.MVA = new List(); FillLocationOfList(data.ALC.MVA); FillCategoriesOfList(data.ALC.MVA); FilterHandler.Instance.SetFilter(data.F, data.CS.LastSelectedCategory.Value, FilterType.Display, adCategoryPreset.ToFilterValues()); adList = adModel.SearchAds(data, DateTime.Now.AddMonths(-int.Parse(ConfigurationManager.AppSettings["ShowAdsThatIsEqualOrLessThenMonth"])), out adCount); data.ALC.MVA.AddRange(Mapper.Map<IList, IList>(adList)); data.ALS.TC = adCount; //When submitting a parameter on the incoming data will be set and if this is set then the //data.LS.L1 will be set to 3. I have cheked that data.LS.L1 is set to 3 when returning a submit. return View(data); } 

Modello :

 public class AdList { public AdList() { this.LS = new LocationSelect(); this.P = new AdListPresets(); } public LocationSelect LS { get; set; } } public class LocationSelect { public int? L1 { get; set; } public int? L2 { get; set; } ///  /// Used when multiple choise is possible ///  public List L3 { get; set; } public SelectList Location1List { get; set; } public SelectList Location2List { get; set; } public LocationSelect() { L3 = new List(); Location1List = new SelectList(new List(), "Value", "Text", -1); Location2List = new SelectList(new List(), "Value", "Text", 0); } } 

Edit2:

Se metto un

   c.LS.L1) %> 

nella vista, sarà renderizzato in questo modo:

  

Il valore dovrebbe essere 3 qui

Edit3:

 private void setDefaultViewData(AdList adList, AdCategoryPreset adCategoryPreset) { this.SetDefaultSettingsOnCategories(adList.CS, adCategoryPreset); SetDefaultSettingsOnLocations(adList.LS, adCategoryPreset); } public static void SetDefaultSettingsOnLocations(LocationSelect locationSelect, AdCategoryPreset adCategoryPreset) { LocationModel locationModel = new LocationModel(); List mvLocationList = new List(); List selectedLocationList = new List(); if (locationSelect != null) { mvLocationList = Mapper.Map<IList, IList>(locationModel.GetLocationsByParentId(null)).ToList(); if (adCategoryPreset != null && adCategoryPreset.LocationIdList.Length > 0) { selectedLocationList = new List(); foreach (string locationId in adCategoryPreset.LocationIdList.Split(',')) selectedLocationList.Add(locationModel.GetLocation(int.Parse(locationId))); locationSelect.Location1List = new SelectList(mvLocationList, "Id", "Name", selectedLocationList[0].ParentId); locationSelect.L1 = selectedLocationList[0].ParentId; mvLocationList = Mapper.Map<IList, IList>(locationModel.GetLocationsByParentId(selectedLocationList[0].ParentId)).ToList(); locationSelect.Location2List = new SelectList(mvLocationList, "Id", "Name"); locationSelect.L3 = selectedLocationList.Select(c => c.Id).ToList(); } else if (locationSelect.L1.HasValue && locationSelect.L1.Value > 0) { locationSelect.Location1List = new SelectList(mvLocationList, "Id", "Name"); //, locationModel.GetLocation(locationSelect.L1.Value)); mvLocationList = Mapper.Map<IList, IList>(locationModel.GetLocationsByParentId(locationSelect.L1)).ToList(); locationSelect.Location2List = new SelectList(mvLocationList, "Id", "Name"); } else { mvLocationList = Mapper.Map<IList, IList>(locationModel.GetLocationsByParentId(null)).ToList(); locationSelect.Location1List = new SelectList(mvLocationList, "Id", "Name", 0); locationSelect.Location2List = new SelectList(new List(), null); } } } 

Quando si carica la pagina la prima volta, la parte else verrà eseguita nel metodo SetDefaultSettingsOnLocations. La seconda volta verrà eseguita la prima sezione if. La parte centrale (altrimenti se) non verrà mai triggersta in questo scenario. Ho controllato che questo è vero in modalità di debug.

Il tuo problema qui è ModelState. POST la tua azione e restituire la stessa vista. La seconda volta che viene visualizzata la vista, verrà esaminato il ModelState e verranno utilizzati tali valori per riempire i controlli. Questo è usato per quando la validazione fallisce:

 if(!ModelState.IsValid) return View(model); 

È questo scenario i valori che l’utente ha inserito sono di nuovo selezionati. Il tuo caso è semplice da risolvere, basta usare:

 ModelState.Clear(); 

prima di restituire la vista.