usar net mvc example como asp asp.net-mvc viewbag dropdownlistfor

asp.net-mvc - net - viewbag vs viewdata



¿Cómo usar un ViewBag para crear una lista desplegable? (6)

Controlador:

public ActionResult Filter() { ViewBag.Accounts = BusinessLayer.AccountManager.Instance.getUserAccounts(HttpContext.User.Identity.Name); return View(); }

Ver:

<td>Account: </td> <td>@Html.DropDownListFor("accountid", new SelectList(ViewBag.Accounts, "AccountID", "AccountName"))</td>

ViewBag.Accounts contiene objetos de Account que tienen AccountID , AccountName y otras propiedades. Me gustaría un DropDownList llamado accountid (para que en el formulario de envío pueda pasar el AccountID seleccionado) y el DropDownList para mostrar el AccountName mientras se tiene el AccountID como valor.

¿Qué estoy haciendo mal en el código de vista?


Hago lo siguiente

En mi metodo de accion

Dictionary<string, string> dictAccounts = ViewModelDropDown.GetAccounts(id); ViewBag.accounts = dictAccounts;

En mi código de vista

Dictionary<string, string> accounts = (Dictionary<string, string>)ViewBag.accounts; @Html.DropDownListFor(model => model.AccountId, new SelectList(accounts, "Value", "Key"), new { style = "width:310px; height: 30px; padding 5px; margin: 5px 0 6px; background: none repeat scroll 0 0 #FFFFFF; vertical-align:middle;" })


Intente usar @Html.DropDownList en @Html.DropDownList lugar:

<td>Account: </td> <td>@Html.DropDownList("accountid", new SelectList(ViewBag.Accounts, "AccountID", "AccountName"))</td>

@Html.DropDownListFor espera un lambda como su primer argumento, no una string para el ID que especifique.

Aparte de eso, sin saber en qué consiste getUserAccounts() , basta con decir que necesita devolver algún tipo de colección (por ejemplo, IEnumerable ) que tenga al menos 1 objeto. Si devuelve null la propiedad en el ViewBag no tendrá nada.


No puede usar Helper @Html.DropdownListFor , ya que el primer parámetro no fue correcto, cambie su ayudante a:

@Html.DropDownList("accountid", new SelectList(ViewBag.Accounts, "AccountID", "AccountName"))

@Html.DropDownListFor recibir en los primeros parámetros una expresión lambda en todas las sobrecargas y se utiliza para crear menús desplegables de tipos fuertes.

Aquí está la documentación.

Si su Vista está fuertemente tipada en algún Modelo, puede cambiar su código usando un ayudante para crear una lista desplegable fuertemente tipada, algo como

@Html.DropDownListFor(x => x.accountId, new SelectList(ViewBag.Accounts, "AccountID", "AccountName"))


Tratar:

En el controlador:

ViewBag.Accounts= new SelectList(db.Accounts, "AccountId", "AccountName");

En la vista:

@Html.DropDownList("AccountId", (IEnumerable<SelectListItem>)ViewBag.Accounts, null, new { @class ="form-control" })

o puede reemplazar el "nulo" con lo que quiera que aparezca como selector predeterminado, es decir, "Seleccionar cuenta".


espero que funcione

@Html.DropDownList("accountid", (IEnumerable<SelectListItem>)ViewBag.Accounts, String.Empty, new { @class ="extra-class" })

Aquí String.Empty estará vacío como selector predeterminado.


Usar Viewbag es incorrecto para enviar la lista para ver. Debería usar Viewmodel en este caso. Me gusta esto:

Enviar lista de países y lista de ciudades y otra lista que necesita mostrar en la vista:

Código del controlador de inicio:

[HttpGet] public ActionResult NewAgahi() // New Advertising { //-------------------------------------------------------- // استفاده از ویومدل برای نمایش چند مدل در ویو Country_Repository blCountry = new Country_Repository(); Ostan_Repository blOstan = new Ostan_Repository(); City_Repository blCity = new City_Repository(); Mahale_Repository blMahale = new Mahale_Repository(); Agahi_Repository blAgahi = new Agahi_Repository(); var vm = new NewAgahi_ViewModel(); vm.Country = blCountry.Select(); vm.Ostan = blOstan.Select(); vm.City = blCity.Select(); vm.Mahale = blMahale.Select(); //vm.Agahi = blAgahi.Select(); return View(vm); } [ValidateAntiForgeryToken] [HttpPost] public ActionResult NewAgahi(Agahi agahi) { if (ModelState.IsValid == true) { Agahi_Repository blAgahi = new Agahi_Repository(); agahi.Date = DateTime.Now.Date; agahi.UserId = 1048; agahi.GroupId = 1; if (blAgahi.Add(agahi) == true) { //Success return JavaScript("alert(''ثبت شد'')"); } else { //Fail return JavaScript("alert(''اشکال در ثبت'')"); }

Código Viewmodel:

using ProjectName.Models.DomainModels; using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace ProjectName.ViewModels { public class NewAgahi_ViewModel // برای استفاده کردن از چند مدل در یک ویو { public IEnumerable<Country> Country { get; set; } public IEnumerable<Ostan> Ostan { get; set; } public IEnumerable<City> City { get; set; } public IQueryable<Mahale> Mahale { get; set; } public ProjectName.Models.DomainModels.Agahi Agahi { get; set; } } }

Ver código:

@model ProjectName.ViewModels.NewAgahi_ViewModel

..... .....

@Html.DropDownList("CountryList", new SelectList(Model.Country, "id", "Name")) @Html.DropDownList("CityList", new SelectList(Model.City, "id", "Name"))

Código de país de repositorio:

using System; using System.Collections.Generic; using System.Linq; using System.Web; using ProjectName.Models.DomainModels; namespace ProjectName.Models.Repositories { public class Country_Repository : IDisposable { private MyWebSiteDBEntities db = null; public Country_Repository() { db = new DomainModels.MyWebSiteDBEntities(); } public Boolean Add(Country entity, bool autoSave = true) { try { db.Country.Add(entity); if (autoSave) return Convert.ToBoolean(db.SaveChanges()); //return "True"; else return false; } catch (Exception e) { string ss = e.Message; //return e.Message; return false; } } public bool Update(Country entity, bool autoSave = true) { try { db.Country.Attach(entity); db.Entry(entity).State = System.Data.Entity.EntityState.Modified; if (autoSave) return Convert.ToBoolean(db.SaveChanges()); else return false; } catch (Exception e) { string ss = e.Message; // کد بلااستفاده فقط برای ازمایش اکسپشن این را نوشتم return false; } } public bool Delete(Country entity, bool autoSave = true) { try { db.Entry(entity).State = System.Data.Entity.EntityState.Deleted; if (autoSave) return Convert.ToBoolean(db.SaveChanges()); else return false; } catch { return false; } } public bool Delete(int id, bool autoSave = true) { try { var entity = db.Country.Find(id); db.Entry(entity).State = System.Data.Entity.EntityState.Deleted; if (autoSave) return Convert.ToBoolean(db.SaveChanges()); else return false; } catch { return false; } } public Country Find(int id) { try { return db.Country.Find(id); } catch { return null; } } public IQueryable<Country> Where(System.Linq.Expressions.Expression<Func<Country, bool>> predicate) { try { return db.Country.Where(predicate); } catch { return null; } } public IQueryable<Country> Select() { try { return db.Country.AsQueryable(); } catch { return null; } } public IQueryable<TResult> Select<TResult>(System.Linq.Expressions.Expression<Func<Country, TResult>> selector) { try { return db.Country.Select(selector); } catch { return null; } } public int GetLastIdentity() { try { if (db.Country.Any()) return db.Country.OrderByDescending(p => p.id).First().id; else return 0; } catch { return -1; } } public int Save() { try { return db.SaveChanges(); } catch { return -1; } } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposing) { if (this.db != null) { this.db.Dispose(); this.db = null; } } } ~Country_Repository() { Dispose(false); } } }