Pregunta

Soy nuevo en el MVC, pero he estado en todo esto, lea toda la documentación y todas las preguntas y todas las entradas del blog que me pueda encontrar, y todo lo que estoy haciendo es llegar completamente envuelto alrededor del eje.

Estoy tratando de hacer una "crear" la Acción y a la Vista.Mi entrada de datos es relativamente sencillo y común:Tengo una lista desplegable y un cuadro de texto.En mi caso, estoy creando un usuario en contacto con el canal, y el cuadro de lista desplegable elige entre el correo electrónico y textmsg, y el cuadro de texto, a continuación, introduce la información de contacto pertinente, ya sea un bien formados dirección de correo electrónico o un número de teléfono móvil.

Aquí está una (ligeramente la forma simplificada de) mi Ver página:

 <tr>
     <td><%= Html.DropDownList("ChannelDescription", Model.ChannelDescription, "Select a Channel", new { id = "ChannelDDL", onchange="ChannelDDLChanged()" })%>
         <br />
         <%= Html.ValidationMessage("ChannelDescription", "Please Select a Channel") %>
      </td>
      <td>
           <%= Html.TextBox("SubscriberNotificationAddr") %> <br />
           <%= Html.ValidationMessage("SubscriberNotificationAddr", "Please enter a contact address or number") %>
       </td>
  </tr>

Estoy usando un establecimiento inflexible de tipos de ViewData modelo, en lugar de utilizar el ViewDataDictionary.El ChannelDescription es un elemento SelectList, que se inicializa con la lista de opciones y no de selección.

La pantalla inicial de la forma, la entrada de datos en el formulario, y la extracción de los datos desde el formulario por el controlador va bien.

Mi problema es que si los datos que contiene un error, como un mal-formado dirección de correo electrónico o número de teléfono celular, y tengo que volver a la vista, no he tenido éxito en la obtención de la lista desplegable de selección se vuelve a mostrar.El ChannelDescription elemento es recreado en el controlador con la elección del usuario como el elemento seleccionado.He establecer puntos de interrupción en la línea de la Vista, y verificado que el elemento seleccionado de la lista de elementos Seleccionados de la propiedad se establece en true, pero aún muestra el valor de "selección de un Canal".

Esto parece que sería una situación muy común, y no debería ser tan difícil.¿Qué estoy haciendo mal?

Para su INFORMACIÓN, esto es con MVC 1.0 (de la Liberación), Windows 7, y de VS 2008, que se ejecuta bajo Firefox 3.5.2.

¿Fue útil?

Solución 2

Tuve algunas conversaciones con Brad Wilson, del equipo de MVC, y él me explicó que no entendía cómo debería usarse el método auxiliar DropDownList (un malentendido que creo que podría ser bastante común, por lo que he leído). ).

Básicamente, CUALQUIERA le da la Lista de selección en el parámetro con nombre del ViewModel, y le permite construir la lista desplegable a partir de eso con los elementos apropiados seleccionados, O le da la Lista de selección como un parámetro separado y deja que el parámetro con nombre de la ViewModel será solo las cadenas de valor para los elementos seleccionados. Si le da un parámetro SelectList, entonces espera que el valor nombrado sea una cadena o una lista de cadenas, NO una SelectList.

Entonces, ahora su ViewModel termina teniendo dos elementos para un elemento conceptual en la vista (la lista desplegable). Por lo tanto, es posible que tenga un modelo que tenga

string SelectedValue {get; set;}
SelectList DropDownElements { get; set;}

Luego, puede rellenar previamente DropDownElements con las opciones, pero en el enlace de la vista de modelo, solo necesita tratar con el elemento SelectedValue. Parece que funciona bastante bien para mí cuando lo hago de esa manera.

Otros consejos

Después de ver la respuesta de arriba, yo quería echarle un vistazo, porque todos los ejemplos que me había visto había, de hecho, utiliza ViewDataDictionary, en lugar de un inflexible ViewDataModel.

Así que hice algunos experimentos.He construido una muy simple punto de vista de que utiliza una llanura ViewDataDictionary, y los valores pasados por el nombre de las teclas.Se conserva el elemento seleccionado bien.Luego he cortado y pegado que Ver (y control) de uno a otro, cambiando sólo lo que era necesario cambiar a un establecimiento inflexible de tipos de ViewData Modelo.Lo y he aquí, también se conserva el elemento seleccionado.

Entonces, ¿qué otra cosa fue diferente entre mi prueba sencilla y de mi solicitud?En mi prueba, me había utilizado simplemente "Html.DropDownList("nombre", "optionLabel")".Sin embargo, en mi solicitud, yo necesitaba para añadir los atributos de HTML, y la única sobrecargas disponible que incluye HtmlAttributes también incluyen la Lista de selección.

Resulta que el DropDownList de sobrecarga con una lista de selección de parámetros se rompió!Buscando en el archivo descargado MVC código fuente, cuando DropDownList se denomina con un nombre o un nombre y un optionLabel, se termina de recuperar el destino de la lista de selección de la ViewData, y luego invocar el privado SelectInternal método por el siguiente llamada:

    return SelectInternal(htmlHelper, optionLabel, name, selectList, true /* usedViewData */, false /* allowMultiple */, (IDictionary<string, object>)null /* htmlAttributes */);

Sin embargo, si se llama con un selectList parámetro, termina con la siguiente:

   return SelectInternal(htmlHelper, optionLabel, name, selectList, false /* usedViewData */, false /* allowMultiple */, htmlAttributes);

La diferencia es que en el primero (que funcionará correctamente) el "usedViewData" parámetro es true, mientras que en el segundo, es falso.Que en realidad es bueno, pero expone una interna defecto en el SelectInternal rutina.

Si usedViewData es falso, se obtiene una variable de objeto "defaultValue" desde el ViewData modelo.Sin embargo, defaultValue se utiliza como si es una cadena o un array de cadenas, cuando, en realidad, lo que se devuelve desde el ViewData es un SelectList.(IEnumerable<SelectListItem>).

Si usedViewData es cierto, entonces defaultValue va a ser null o una cadena.

A continuación, si el valor predeterminado es no nulo, es lo que termina pasando en un bloque de código que contiene esto:

        foreach (SelectListItem item in selectList) {
            item.Selected = (item.Value != null) ? selectedValues.Contains(item.Value) : selectedValues.Contains(item.Text);
            newSelectList.Add(item);

selectList es el original selectList que se pasó, por lo que el elemento es un SelectListItem (string Texto, cadena de Valor, y bool Seleccionado).Pero selectedValues se deriva de la defaultValue, y se convierte en una Lista de SelectLists, no una Lista de cadenas.Así que para cada uno de los elementos, es la configuración de los Seleccionados de la bandera en función de si el selectedValues lista de lo que "Contiene" el elemento.Valor.Bueno, una Lista de SelectLists nunca va a "Contener" una cadena, por lo que el tema.Seleccionada nunca se pone.(Corrección:en realidad, después de más de seguimiento con el depurador, me encontré con que selectedValues se deriva de la defaultValue por un "ToString()" de la llamada.Por lo que en realidad es una lista de cadenas de caracteres, pero en lugar de contener los valores que queremos, que contiene "del Sistema.Web.Mvc.SelectList" - el resultado de la aplicación de "ToString()" al objeto complejo como un SelectList.El resultado es el mismo - no vamos a encontrar el valor que estamos buscando en la lista.)

Se sustituye el recién construido "newSelectList" para el original "selectList", y se procede a construir el HTML de la misma.

Como cagdas (me disculpo por descuartizar a su nombre, pero no sé cómo hacer que los personajes en mi Teclado americano) dicho anteriormente, creo que voy a tener que construir mi propio método para utilizar en lugar de la DropDownList HtmlHelper.Supongo que dado que esta versión 1 y la Release2 está en la versión Beta 2, que realmente no puede esperar cualquier correcciones de errores a menos que lo hacemos nosotros mismos a la derecha?

Por CIERTO, si has seguido me esta lejos, este código se encuentra en src\SystemWebMvc\Mvc\Html\SelectExtensions.cs, en alrededor de la línea 116-136

Sí, yo también tuve tantos problemas para DropDownList a respetar el elemento seleccionado le he dado a él.

Por favor, compruebe mi respuesta a esta pregunta.Tan lejos como puedo recordar, que era la única manera de conseguir que funcione.Al pasar la lista a través de ViewData.

FYI, dejé de usar que HtmlHelper método.Ahora soy simplemente la salida de los <select> y <option> etiquetas de mí mismo con un lazo y la configuración de la selected la propiedad de la option etiqueta mediante la comprobación de mí mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top