asp.net-mvc-3 - mvc - @html.dropdownlist selected value
dropdownlist establece el valor seleccionado en MVC3 Razor (9)
Aquí está mi modelo:
public class NewsCategoriesModel {
public int NewsCategoriesID { get; set; }
public string NewsCategoriesName { get; set; }
}
Mi controlador:
public ActionResult NewsEdit(int ID, dms_New dsn) {
dsn = (from a in dc.dms_News where a.NewsID == ID select a).FirstOrDefault();
var categories = (from b in dc.dms_NewsCategories select b).ToList();
var selectedValue = dsn.NewsCategoriesID;
SelectList ListCategories = new SelectList(categories, "NewsCategoriesID", "NewsCategoriesName",selectedValue);
// ViewBag.NewsCategoriesID = new SelectList(categories as IEnumerable<dms_NewsCategory>, "NewsCategoriesID", "NewsCategoriesName", dsn.NewsCategoriesID);
ViewBag.NewsCategoriesID = ListCategories;
return View(dsn);
}
Y luego mi punto de vista:
@Html.DropDownList("NewsCategoriesID", (SelectList)ViewBag.NewsCategoriesID)
Cuando ejecuto, DropDownList
no selecciona el valor que configuro. Siempre selecciona la primera opción.
Bueno, es muy simple en el controlador tienes algo como esto:
-- Controlador
ViewBag.Profile_Id = new SelectList(db.Profiles, "Id", "Name", model.Profile_Id);
- Vista (Opción A)
@Html.DropDownList("Profile_Id")
--View (Opción B) -> Enviar un valor nulo a la lista
@Html.DropDownList("Profile_Id", null, "-- Choose --", new { @class = "input-large" })
Deberías usar view models y olvidarte de ViewBag
Piénsalo como si no existiera. Verás cuán fácil se volverán las cosas. Así que defina un modelo de vista:
public class MyViewModel
{
public int SelectedCategoryId { get; set; }
public IEnumerable<SelectListItem> Categories { get; set; }
}
y luego rellene este modelo de vista desde el controlador:
public ActionResult NewsEdit(int ID, dms_New dsn)
{
var dsn = (from a in dc.dms_News where a.NewsID == ID select a).FirstOrDefault();
var categories = (from b in dc.dms_NewsCategories select b).ToList();
var model = new MyViewModel
{
SelectedCategoryId = dsn.NewsCategoriesID,
Categories = categories.Select(x => new SelectListItem
{
Value = x.NewsCategoriesID.ToString(),
Text = x.NewsCategoriesName
})
};
return View(model);
}
y finalmente, en su vista, use el DropDownListFor
helper fuertemente tipado:
@model MyViewModel
@Html.DropDownListFor(
x => x.SelectedCategoryId,
Model.Categories
)
Para tener seleccionado el departamento de TI, cuando los departamentos se cargan desde la tabla tblDepartment, use el siguiente constructor sobrecargado de la clase SelectList. Tenga en cuenta que estamos pasando un valor de 1 para el parámetroValue seleccionado.
ViewBag.Departments = new SelectList(db.Departments, "Id", "Name", "1");
Perforé la formación de la lista desplegable en lugar de usar @Html.DropDownList()
. Esto es útil si tiene que establecer el valor de la lista desplegable en el tiempo de ejecución en razor en lugar de controlador:
<select id="NewsCategoriesID" name="NewsCategoriesID">
@foreach (SelectListItem option in ViewBag.NewsCategoriesID)
{
<option value="@option.Value" @(option.Value == ViewBag.ValueToSet ? "selected=''selected''" : "")>@option.Text</option>
}
</select>
Prefiero la forma lambda del ayudante DropDownList - vea la página de diseño MVC 3, la plantilla Razor y la lista desplegable
Si desea usar SelectList, entonces creo que este informe de error podría ayudarlo - http://aspnet.codeplex.com/workitem/4932
Quiero poner la respuesta correcta aquí, en caso de que otros tengan este problema como yo. Si odias ViewBag, no lo uses, pero el problema real con el código en la pregunta es que se está usando el mismo nombre para la propiedad del modelo y la lista de selección como se señaló en @RickAndMSFT
Simplemente cambiando el nombre del control DropDownList debería resolver el problema, así:
@Html.DropDownList("NewsCategoriesSelection", (SelectList)ViewBag.NewsCategoriesID)
En realidad, no tiene nada que ver con el uso del ViewBag o el uso del ViewBag ya que puede tener una colisión de nombre con el control independientemente.
Reemplace la línea siguiente por un nuevo código de trabajo actualizado:
@Html.DropDownList("NewsCategoriesID", (SelectList)ViewBag.NewsCategoriesID)
Ahora implemente un nuevo código de trabajo actualizado :
@Html.DropDownListFor(model => model.NewsCategoriesID, ViewBag.NewsCategoriesID as List<SelectListItem>, new {name = "NewsCategoriesID", id = "NewsCategoriesID" })
codigo abajo, obtener , va
Controlador:
int DefaultId = 1;
ViewBag.Person = db.XXXX
.ToList()
.Select(x => new SelectListItem {
Value = x.Id.ToString(),
Text = x.Name,
Selected = (x.Id == DefaultId)
});
Ver:
@Html.DropDownList("Person")
Nota: ViewBag. El nombre de persona y @ Html.DropDownList (" Persona ") debe ser como en el modelo de vista
por si alguien viene con esta pregunta, así es como lo hago, por favor olvídate del objeto de repositorio, estoy usando el Patrón de Repositorio, puedes usar el contexto de tu objeto para recuperar las entidades. Y tampoco preste atención a los nombres de mi entidad, mi tipo de entidad Acción no tiene nada que ver con una Acción MVC.
Controlador:
ViewBag.ActionStatusId = new SelectList(repository.GetAll<ActionStatus>(), "ActionStatusId", "Name", myAction.ActionStatusId);
Preste atención a que la última variable del constructor SelectList es el valor seleccionado (object selectedValue)
Entonces esta es mi opinión para renderizarlo:
<div class="editor-label">
@Html.LabelFor(model => model.ActionStatusId, "ActionStatus")
</div>
<div class="editor-field">
@Html.DropDownList("ActionStatusId")
@Html.ValidationMessageFor(model => model.ActionStatusId)
</div>
Creo que es bastante simple, ¡espero que esto ayude! :)