2012-06-14 15 views
6

tengo un modelo:Obtener el texto de Html.DropdownListFor .... MVC3

public class DocumentModel 
{ 
    public int TypeID { get; set; } 
    public List<SelectListItem> DocumentTypes { get; set; } 
} 

Tengo una visión:

@Html.DropDownListFor(x => x.TypeID, Model.DocumentTypes, "- please select -") 

que pueblan mi desplegables

 var model = new DocumentModel(); 
     model.DocumentTypes = GetDocumentTypes(); 

private static List<SelectListItem> GetDocumentTypes() 
    { 

     var items = new List<SelectListItem> 
         { 
          new SelectListItem 
           {Text = @"Text #1", Value = "1"}, 
          new SelectListItem 
           {Text = @"Text #2", Value = "2"}, 
         }; 

     return items; 

    } 

Tengo una acción de controlador cuando se devuelve el formulario:

[HttpPost] 
    public void UploadDocument(DocumentModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      // I want to get the text from the dropdown 
     } 
    } 

¿Cómo obtengo el texto de mi lista desplegable? Gracias

+0

¿Desea recuperar el elemento seleccionado? –

+0

Creo que en un envío de formulario que contiene una lista desplegable, solo se envía el 'VALOR 'seleccionado. Puede tomar el valor y buscar el texto de la lista, o puede expandirlo y planificarlo y pasarlo en un '@ Html.HiddenFor()'. – user1166147

Respuesta

17

Es posible que no obtenga esto fácilmente con el enlace de modelo predeterminado. Tienes que hacer una pequeña solución como esta.

1) añadir una nueva propiedad a su modelo/modelo de vista para almacenar el texto seleccionado

public class DocumentModel 
{ 
    public int TypeID { get; set; } 
    public List<SelectListItem> DocumentTypes { get; set; } 
    public string SelctedType { set;get;} 
} 

2) Uso método Html.HiddenFor ayudante para crear una variable oculta bajo la forma de esta propiedad

@Html.HiddenFor(x => x.SelctedType) 

3) ¡Utilice un pequeño javascript para invalidar el envío! es decir; Cuando el usuario envía el formulario, obtenga el texto seleccionado del menú desplegable y establezca ese valor como el valor del campo Oculto.

$(function() { 
    $("form").submit(function(){ 
     var selTypeText= $("#TypeID option:selected").text(); 
     $("#SelctedType").val(selTypeText);   
    }); 
}); 

En su método de acción HTTPPost, esto estará disponible en la propiedad SelectedType.

[HttpPost] 
public void UploadDocument(DocumentModel model) 
{ 
    if(ModelState.IsValid) 
    { 
     string thatValue=model.SelectedType; 
    } 
} 
+0

Gracias por responder, pero model.SelectedType es nulo cuando se llama a UploadDocument.Todavía me falta algo – BoundForGlory

+0

@ user1202717: Use una alerta en el Paso 3 antes de enviar el formulario (justo después de establecer el valor del campo oculto) para ver si lo configuró correctamente – Shyju

+1

Funciona. Veo que cambiaste esta línea 'var selTypeText = $ ("# TypeID option: selected"). Text();' El hombre no puedo creer que los menús desplegables sean tan dolorosos en mVC. Gracias – BoundForGlory

2

si lo que quieres hacer es recuperar elemento seleccionado, entonces esto puede hacer el trabajo:

var selecteItem = model.DocumentTypes.Where(item=>item.Selected).FirstOrDefault(); 

Salud!

+0

Ejecuto esto y selectedItem es nulo – BoundForGlory

1

En el modelo que tendría otra cadena -

public string Selected{ get; set; } 

continuación, en su opinión:

@Html.DropDownListFor(model => model.Selected, new SelectList(Model.DocumentTypes, "Value", "Text")) 
+0

Intenté esto y ejecuté esta línea de código 'var selecteItem = model.DocumentTypes.Where (item => item.Selected) .FirstOrDefault();' y selectedItem sigue siendo nulo – BoundForGlory

+0

No debería haber necesitado las cosas de var etc. En su controlador, simplemente debería haber podido hacer la cadena seleccionada = modelo. Seleccionada; Si luego tuvo un punto de quiebre en la siguiente línea, la cadena seleccionada debería tener el valor del menú desplegable. –

1

Me encontré aquí tratando de encontrar la manera de obtener el valor de texto de una lista de selección para mostrarla en un formato que no sea DropDownList (estoy reutilizando mi Edit ViewModel ya que tiene todos los datos requeridos)

var text = selectList.Where(q => q.Selected == true).First().Text; 
Cuestiones relacionadas