2008-11-19 14 views
30

¿Tengo razón en pensar que no hay forma de establecer el valor seleccionado en la Lista de selección de la clase C# después de crearlo? ¿No es un poco tonto?Establecer el valor seleccionado en la Lista de selección después de la instanciación

+1

Debo estar de acuerdo con usted acerca de que sea una tontería. La lista de selección parece haber sido deliberadamente "nerfed" para forzarlo a crear modelos de vistas más puros (y pesados). Un caso particular de esto es si desea reutilizar una lista de selección en una tabla donde cada fila debe basar su valor seleccionado en otra lista en su modelo de vista. Si desea utilizar SelectList, en realidad tiene que crear una matriz de SelectList, cada una de ellas preasignada con su valor seleccionado, ya que no hay forma de seleccionarla "sobre la marcha" justo antes de usarla en su código de vista de afeitar para esa fila en particular. – Johncl

Respuesta

18

Creo que está luchando contra el marco. Los datos que entran en sus puntos de vista deben crearse en el Último posible minuto (LPM).

Pensando de esta manera, un SelectList es un tipo para alimentar al ayudante de HTML DropDownList. NO es un lugar para almacenar datos mientras usted decide cómo procesarlo.

Una mejor solución sería recuperar sus datos en un List<T> y luego inicializar el SelectList (s) cuando lo necesite.Un beneficio inmediato de esta práctica es que permite volver a utilizar su List<T> para más de un DropDownList, tales como:

Country of birth 
Country of residence 

Estos SelectLists todo el uso de la lista de países de tipo List<Country>.

Puede utilizar su List<T> en el 'último minuto' como en este ejemplo:

public class TaxCheatsFormViewModel 
{ 
    private List<Country> countries { get; set; } 

    public TaxCheat Cheat { get; private set; } 
    public SelectList CountryOfBirth { get; private set; } 
    public SelectList CountryOfResidence { get; private set; } 
    public SelectList CountryOfDomicile { get; private set; } 

    public TaxCheatsFormViewModel(TaxCheat baddie) 
    { 
     TaxCheat = baddie; 
     countries = TaxCheatRepository.GetList<Country>(); 
     CountryOfBirth = new SelectList(countries, baddie.COB); 
     CountryOfResidence = new SelectList(countries, baddie.COR); 
     CountryOfDomicile = new SelectList(countries, baddie.COD); 
    } 
} 

El punto es que usted debe mantener sus datos en un List<T> hasta que realmente necesita para dar salida a ella; el último minuto posible (LPM).

+0

Esta es de hecho la forma en que fui. En mi opinión, entonces creo una lista de selección de mi lista. Donde corresponda, tengo un método auxiliar que hace esto. –

0

¿Te refieres al lado del cliente, en el navegador?

var select = document.getElementById('mySelect'); 
select.options[newIndex].selected = true; 
3

La propiedad "SelectedValue" es de solo lectura. Configurarlo en el constructor es la única forma.

Tor, SelectList es una construcción ASP.NET MVC utilizada para crear una lista desplegable. Hacerlo a tu manera también debería funcionar, pero SelectList debería hacerlo por ti (y no en JS) si se hace correctamente.

+8

¿Por qué, por el amor de Dios, es solo de lectura? ¿Y por qué no puedes manipular los elementos después de la instanciación? ¿Y por qué entonces no se puede exponer como una matriz de solo lectura? ¡Este tipo de datos va más allá de mí! –

+0

Si no te gusta, escribe tu propia versión. No es tan complicado, chico. – Will

+15

@ will: Es cierto, pero no creo que soy el único con estos sentimientos hacia la clase SelectList. ¿Deberíamos todos escribir el nuestro entonces? –

1

Creo que puede hacer esto en el controlador. Si va a presentar una lista desplegable con el nombre/ID StateCode, puede establecer el estado seleccionado utilizando este código después de crear la lista de selección:

ViewData ["StateCode"] = "VT";

Parece que el helper HTML de la lista desplegable busca un elemento ViewData con el mismo nombre que la lista desplegable que se está creando.

No creo que me guste usar esta técnica, pero parece que funciona.

Estoy de acuerdo en que la clase SelectList es un poco débil en este momento. Me gustaría poder crear una lista de selección y luego seleccionar un valor más adelante por valor o texto.

+0

Observé que comienza a producir sensación cuando usa una colección regular en el controlador y la lista de selección solo en el último momento a la vista. Aunque realmente no me gusta de esa manera, me quita mucha fricción ... –

0

El objeto SelectList es de solo lectura después de haber sido creado. si desea seleccionar algo que es mejor hacerlo como:

<%= Html.DropDownList("clientId", ViewData["clients"] as List<SelectListItem>,)%> 

Y en el código subyacente:

ViewData["clientId"] = "ASD"; //This should be the value of item you want to select 
    ViewData["clients"] = clientItemList; //List<SelectListItem> 
+0

Intento mantenerme alejado del código subyacente porque esto distribuiría el código entre mi controlador, mi vista Y mi código. Lo que hago ahora es crear una instancia del elemento SelectListItem en la vista. No es como lo prefiero, pero así es como la galleta se desmorona. –

0

podría hacerlo bastante fácil con jQuery;

$(function() { 
    $("#myselectlist option[@value='ItemToSelectValue'].attr('selected', 'true'); 
}); 
+0

La pregunta es en realidad hablar de la lista Select del tipo C#. Actualizaré el OP para eliminar la confusión. –

0

Necesitaba un menú desplegable en una cuadrícula editable con los valores de lista desplegable preseleccionados. Afaik, el controlador proporciona la información de la lista de selección a la vista, por lo que se crea antes de que la vista la consuma. Una vez que la vista consume SelectList, se la entrego a un helper personalizado que usa el asistente DropDownList estándar. Entonces, una solución bastante ligera imo. Supongo que encaja en el espíritu ASP.Net MVC en el momento de la escritura; cuando no está satisfecho, haga rodar su propio ...

public static string DropDownListEx(this HtmlHelper helper, string name, SelectList selectList, object selectedValue) 
{ 
    return helper.DropDownList(name, new SelectList(selectList.Items, selectList.DataValueField, selectList.DataTextField, selectedValue)); 
} 
4

Debido a que este es un resultado tan alta en Google, te paso lo que he encontrado para trabajar aquí (a pesar de la edad):

Si está utilizando una vista de tipo firme (es decir, el modelo tiene un tipo asignado), SelectedValue proporcionado al Constructor de la Lista de selección se sobrescribe con el valor del objeto utilizado para el Modelo de la página.

Esto funciona bien en una página de edición, pero no para Create cuando desea preseleccionar un valor específico, por lo que una solución es simplemente asignar el valor correcto en un objeto construido predeterminado que pase a la vista como el Modelo. p.

var model = new SubjectViewModel() 
{ 
    Subject = new Subject(), 
    Types = data.SubjectTypes.ToList() 
} 
model.Subject.SubjectType = model.Types.FirstOrDefault(t => t.Id == typeId); 
ViewData.Model = model; 
return View(); 

lo que el código en mi Crear vista que se ve así:

Html.DropDownListFor(model => model.Subject.SubjectTypeId, new SelectList(model.Types, "Id", "Name")) 

devuelve la Lista desplegable con el valor que asigna como el SelectedValue en la lista.

4

Lo sé 'una vieja pregunta, pero podría ayudar a alguien por ahí. Hice lo que parece ser muy parecido a lo que hizo Erik. Acabo de crear un nuevo SelectList de mi existente ...

SelectList myList = GetMySelectList(); 
SelectListItem selected = myList.FirstOrDefault(x => x.Text.ToUpper().Contains("UNITED STATES")); 
if (selected != null) 
{ 
    myList = new SelectList(myList, "value", "text", selected.Value); 
} 
0

Estoy de acuerdo con @awrigley y otras que es mejor para cargar el valor seleccionado mediante el constructor selectlist en el caso habitual cuando se tiene una única lista desplegable . Sin embargo, a veces, uno necesita establecer el valor seleccionado en la vista, como cuando tiene una página con n desplegables idénticos. Dado que no es práctico crear tales colecciones en el controlador y puede que ni siquiera sepa con anticipación cuántas listas desplegables necesita, un mejor enfoque es crear una instancia en el modelo de vista como una plantilla sin un conjunto de valores seleccionados y luego crear dinámicamente el resto dinámicamente en la vista.

Me encuentro con esto a menudo al iterar a través de una lista de elementos secundarios en las vistas de edición cuando los niños necesitan menús desplegables. En tales casos, puede hacerlo así con una línea de código:

@Html.DropDownListFor(x => myViewModelFieldName, new SelectList(Model.MyRawSelectListFromMyViewModel.Select(x=> new {x.Value, x.Text}), "Value", "Text", TheValueYouWantToSelect)) 
Cuestiones relacionadas