asp.net-mvc - tutorial - web forms c#
Html.DropdownListPara que el valor seleccionado no se establezca (11)
¿Cómo puedo establecer el valor seleccionado de Html.DropDownListFor? He estado mirando en línea y he visto que se puede lograr utilizando el cuarto parámetro, por lo que me gusta el siguiente:
@Html.DropDownListFor(m => m, new SelectList(Model, "Code", "Name", 0), "Please select a country")
Mi lista de selección se muestra así:
<select id="ShipFromCountries" name="ShipFromCountries">
<option value="">Please select a country</option>
<option value="GB">United Kingdom</option>
<option value="US">United States</option>
...
</select>
Pero, por alguna razón, Reino Unido sigue seleccionado, pero quiero que se seleccione "Seleccione un país".
Alguien sabe cómo puedo lograr esto?
EDITAR
He actualizado mi código ya que hubo un ligero cambio en la funcionalidad, sin embargo, parece que todavía se está encontrando con este problema. Esto es lo que está en mi opinión:
@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")
1
es el ID de la option
que deseo seleccionar, también he intentado con el texto de la option
pero eso tampoco funciona.
¿Algunas ideas?
Asegúrese de haber recortado el valor seleccionado antes de asignar.
//Modelo
public class SelectType
{
public string Text { get; set; }
public string Value { get; set; }
}
//Controlador
var types = new List<SelectType>();
types.Add(new SelectType() { Value = 0, Text = "Select a Type" });
types.Add(new SelectType() { Value = 1, Text = "Family Trust" });
types.Add(new SelectType() { Value = 2, Text = "Unit Trust"});
ViewBag.PartialTypes = types;
//Ver
@Html.DropDownListFor(m => m.PartialType, new SelectList(ViewBag.PartialTypes, "Value", "Text"), new { id = "Type" })
Cuando pasas por un objeto como este:
new SelectList(Model, "Code", "Name", 0)
usted está diciendo, la Fuente ( Model
) y la Clave ( "Code"
) el Texto ( "Name"
) y el valor seleccionado 0
. Problably no tiene un valor 0
en su fuente para la propiedad Code
, por lo tanto, el helper html seleccionará el primer elemento. Para pasar el valor real seleccionado a este control.
Deberías olvidarte de la clase
SelectList
Use esto en su Controlador:
var customerTypes = new[]
{
new SelectListItem(){Value = "all", Text= "All"},
new SelectListItem(){Value = "business", Text= "Business"},
new SelectListItem(){Value = "private", Text= "Private"},
};
Seleccione el valor:
var selectedCustomerType = customerTypes.FirstOrDefault(d => d.Value == "private");
if (selectedCustomerType != null)
selectedCustomerType.Selected = true;
Agregue la lista a ViewData:
ViewBag.CustomerTypes = customerTypes;
Use esto en su Vista:
@Html.DropDownList("SectionType", (SelectListItem[])ViewBag.CustomerTypes)
-
Más información en: http://www.asp.net/mvc/overview/older-versions/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc
Linq a Dropdown con el elemento vacío, elemento seleccionado (funciona al 100%)
(Muy tipado, posibilidad de error mínimo) Cualquier cambio de modelo se reflejará en el enlace
Controlador
public ActionResult ManageSurveyGroup()
{
tbl_Survey sur = new tbl_Survey();
sur.Survey_Est = "3";
return View(sur);
}
Ver
@{
//Step One : Getting all the list
var CompEstdList = (from ComType in db.tbl_CompEstdt orderby ComType.Comp_EstdYr select ComType).ToList();
//Step Two : Adding a no Value item **
CompEstdList.Insert(0, new eDurar.Models.tbl_CompEstdt { Comp_Estdid = 0, Comp_EstdYr = "--Select Company Type--" });
//Step Three : Setting selected Value if value is present
var selListEstd= CompEstdList.Select(s => new SelectListItem { Text = s.Comp_EstdYr, Value = s.Comp_Estdid.ToString() });
}
@Html.DropDownListFor(model => model.Survey_Est, selListEstd)
@Html.ValidationMessageFor(model => model.Survey_Est)
Este método para vincular datos también es posible
var selList = CompTypeList.Select(s => new SelectListItem { Text = s.CompTyp_Name, Value = s.CompTyp_Id.ToString(), Selected = s.CompTyp_Id == 3 ? true : false });
Para mí no estaba funcionando así que funcionó de esta manera:
Controlador:
int selectedId = 1;
ViewBag.ItemsSelect = new SelectList(db.Items), "ItemId", "ItemName",selectedId);
Ver:
@Html.DropDownListFor(m => m.ItemId,(SelectList)ViewBag.ItemsSelect)
JQuery:
$("document").ready(function () {
$(''#ItemId'').val(''@Model.ItemId'');
});
Para mi, solución general :)
@{
var selectedCity = Model.Cities.Where(k => k.Id == Model.Addres.CityId).FirstOrDefault();
if (selectedCity != null)
{
@Html.DropDownListFor(model => model.Addres.CityId, new SelectList(Model.Cities, "Id", "Name", selectedCity.Id), new { @class = "form-control" })
}
else
{
@Html.DropDownListFor(model => model.Cities, new SelectList(Model.Cities, "Id", "Name", "1"), new { @class = "form-control" })
}
}
Sé que esto no es realmente una respuesta a la pregunta, pero estaba buscando una forma de inicializar DropDownList de una lista sobre la marcha en la vista cuando me encontraba tropezando con esta publicación.
Mi error fue que intenté crear una lista de selección de un diccionario como este:
//wrong!
@Html.DropDownListFor(m => m.Locality, new SelectList(new Dictionary<string, string>() { { Model.Locality, Model.Locality_text } }, Model.Locality, ...
Luego fui a buscar en el documento msdn oficial y descubrí que DropDownListFor
no requiere necesariamente una SelectList
, sino un IEnumerable<SelectListItem>
:
//right
@Html.DropDownListFor(m => m.Locality, new List<SelectListItem>() { new SelectListItem() { Value = Model.Locality, Text = Model.Locality_text, Selected = true } }, Model.Locality, new { @class = "form-control select2ddl" })
En mi caso, probablemente también pueda omitir el Model.Locality
como elemento seleccionado, ya que a) es el único elemento yb) ya lo dice en la propiedad SelectListItem.Selected
.
En caso de que se lo pregunte, el origen de datos es una página AJAX, que se carga dinámicamente utilizando el control SelectWoo / Select2.
Si sabe lo que estará en la vista, también puede establecer el valor predeterminado desde Controlador, en lugar de configurarlo en el archivo de vista / cshtml. No es necesario establecer el valor predeterminado desde el lado HTML.
En el archivo del controlador.
commission.TypeofCommission = 1;
return View(commission);
En el archivo .cshtml.
@Html.DropDownListFor(row => row.TypeofCommission, new SelectList(Model.commissionTypeModelList, "type", "typeName"), "--Select--")
Su código tiene algunos problemas conceptuales:
Primero ,
@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")
Al usar DropDownListFor, el primer parámetro es la propiedad donde se almacena el valor seleccionado una vez que envía el formulario. Entonces, en su caso, debe tener un SelectedOrderId
como parte de su modelo o algo así, para usarlo de esta manera:
@Html.DropDownListFor(n => n.SelectedOrderId, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")
Segundo ,
Además de usar ViewBag, eso no está mal, pero hay formas mejores (poner esa información en el ViewModel), hay un "pequeño error" (o un comportamiento no esperado) cuando su propiedad ViewBag, donde está sosteniendo SelectList, es el mismo nombre de la propiedad donde coloca el valor seleccionado. Para evitar esto, simplemente use otro nombre al nombrar la propiedad que contiene la lista de elementos.
Algún código que usaría si fuera usted para evitar estos problemas y escribir mejor código MVC:
Viewmodel:
public class MyViewModel{
public int SelectedOrderId {get; set;}
public SelectList OrderTemplates {get; set;}
// Other properties you need in your view
}
Controlador:
public ActionResult MyAction(){
var model = new MyViewModel();
model.OrderTemplates = new SelectList(db.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1);
//Other initialization code
return View(model);
}
En su vista:
@Html.DropDownListFor(n => n.SelectedOrderId, Model.OrderTemplates, "Please select an order template")
Agregue la sección del controlador
ViewBag.Orders= new SelectList(db.Orders, "Id", "business", paramid);
Agregue la sección Html
@Html.DropDownList("Orders", null)
Un método simple
public byte UserType
public string SelectUserType
Necesitas obtener uno y configurar uno diferente. El valor seleccionado no puede ser el mismo elemento que está a punto de establecer.
@Html.DropDownListFor(p => p.SelectUserType, new SelectList(~~UserTypeNames, "Key", "Value",UserType))
Utilizo el diccionario Enum para mi lista, por eso hay un par de "clave", "valor".