2011-02-03 33 views
6

Buenas tardes a todos Tengo una pregunta sobre la validación de los valores de la lista desplegable. Tengo una vista que está vinculada a un tipo de modelo de vista llamado ReservationData.ASP.NET MVC 3 - Pregunta de validación

Este objeto contiene una propiedad CustomerVehicles de tipo List<VehicleData>. VehicleData tiene dos int propiedades VehicleMakeId y VehicleModelId.

En mi opinión, estoy tratando de recorrer el número de elementos en la colección CustomerVehicles y mostrar dos listas desplegables para cada uno, un menú desplegable de vehículo y un modelo de vehículo usando DropDownListFor.

Cuando intento enviar y validar, no veo ningún error de validación en la pantalla.

Por si acaso te estás preguntando he agregado un ValidationMessageFor para cada menú desplegable también. No estoy seguro de si esto es un problema con la estructura de mi modelo de vista y su complejidad, y cómo deben nombrarse los controles o cómo deben establecerse los identificadores. Cualquier ayuda sería muy apreciada.

Aquí está el código para el bucle sobre la colección:

@for (var i = 0; i < Model.CustomerVehicles.Count(); i++) 
    { 
     var vehicleNumber = i + 1; 
     <div class="vehicle-selection-wrapper"> 
      <div class="content-container"> 
       <h3> 
        Vehicle @vehicleNumber</h3> 
       <img class="vehicle-image" alt="manufacturer image" src="@Url.Content("~/Content/images/default-vehicle.gif")" /><br /> 
       @Html.LabelFor(m => m.CustomerVehicles[i].VehicleMakeId) 
       @Html.DropDownListFor(m => m.CustomerVehicles[i].VehicleMakeId 
      , new SelectList(Model.VehicleMakes, "Id", "Name") 
          , @UIDisplay.Dropdown_DefaultOption, new { @class = "long-field" })<br /> 
       @Html.ValidationMessageFor(m => m.CustomerVehicles[i].VehicleMakeId)<br /> 
       @Html.LabelFor(m => m.CustomerVehicles[i].VehicleModelId) 
       @Html.DropDownListFor(m => m.CustomerVehicles[i].VehicleModelId 
      , new SelectList(new List<CWR.Domain.VehicleModel>(), "Id", "Name") 
       , @UIDisplay.Dropdown_DefaultOption, new { @class = "long-field" }) 
       @Html.ValidationMessageFor(m => m.CustomerVehicles[i].VehicleModelId) 
      </div> 
     </div> 
    } 

Ok por lo que también me di cuenta de que en el HTML generado que seleccione el que se generan faltan los atributos de datos-val HTML5 que están asociados a los elementos para manejar la validación Aquí está el código HTML generado

<select class="long-field" id="CustomerVehicles_0__VehicleMakeId"   name="CustomerVehicles[0].VehicleMakeId"><option value="">-- Select --</option> 
</select><br /> 
<span class="field-validation-valid" data-valmsg- for="CustomerVehicles[0].VehicleMakeId" data-valmsg-replace="true"></span><br /> 
<label for="CustomerVehicles_0__VehicleModelId">Model</label> 
<select class="long-field" id="CustomerVehicles_0__VehicleModelId" name="CustomerVehicles[0].VehicleModelId"><option value="">-- Select --</option> 
</select> 
<span class="field-validation-valid" data-valmsg-for="CustomerVehicles[0].VehicleModelId" data-valmsg-replace="true"></span> 

Además en mi clase VehicleData los VehicleMakeId y VehicleModelId propiedades están decoradas con un atributo Required.

ACTUALIZACIÓN:

Ok, así que estaba poniendo a prueba y se dio cuenta de que si sigo mi código idéntico, excepto que intercambiar las llamadas con Html.DropdownListForHtml.TextboxFor llamadas luego las obras de validación. ¿Qué podría estar causando esto? ¿Podría ser un error de marco con la validación discreta?

ACTUALIZACIÓN: contenga la reparación

Así que después de la publicación de esta misma pregunta en el ASP.NET Forums, yo era capaz de conseguir una solución. En la publicación, podrá ver que hay un error en el marco de validación discreto y cómo maneja la validación de las listas desplegables. El usuario counsellorben hace un buen trabajo al explicar el problema, así como una solución (incluido un código de muestra) que ayudará a otros a evitar este problema en el futuro, o al menos hasta que Microsoft cree una solución para el marco.

Gracias a todos por su ayuda.

+0

¿Tiene un ejemplo de cómo usar este Ayudante personalizado dentro de una vista? Gracias. – Brandon

Respuesta

0

debe tratar de agregar anotaciones de datos en las propiedades de su modelo de vista primero para que pueda ver los mensajes de validación.

que puede encontrar lo que necesita aquí

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx

o crear otros personalizados, si es necesario.

¿Qué necesitas exactamente para validar?

+0

simplemente desea confirmar si siguió para corregir el patrón sobre cómo hacer una validación de la vista, como agregar <% Html.EnableClientVAlidation(); %> e incluye los javascripts necesarios – michaelalm

+0

@mreyeros - ¿puedes editar tu publicación y publicar el código allí? Aquí no se puede leer. Actualmente estoy usando ASP.NET MVC 2 y no estoy familiarizado con las cosas nuevas que ASP.NET MVC 3 (RAZOR/ubostrusive ajax, etc.) tiene. si pudieras limpiar tu publicación, espero que alguien más te pueda ayudar. lo siento – michaelalm

2

Yo también he encontrado esta supervisión obviamente masiva con respecto a la validación del lado del cliente con listas desplegables en MVC 3 y la mejor solución que puedo ofrecer es poner los atributos HMTL que faltan en ti.

En su modelo de vista, cree una propiedad como esta.

public Dictionary<string, object> CustomerVechicleAttributes 
    { 
     get 
     { 
      Dictionary<string, object> d = new Dictionary<string, object>(); 
      d.Add("data-val", "true"); 
      d.Add("data-val-required", "Please select a Vechicle."); 
      return d; 
     } 
    } 

Luego, en su código, introduzca

@Html.DropDownListFor(m => m.CustomerVehicles[i].VehicleMakeId 
      , new SelectList(Model.VehicleMakes, "Id", "Name") 
      , @UIDisplay.Dropdown_DefaultOption, 
      **Model.CustomerVechicleAttributes** }) 

Basta con añadir el Model.CustomerVechicleAttributes como htmlAttributes a su lista desplegable. Esto inyectará los atributos necesarios que faltan. Por supuesto, necesitará agregar cualquier otro atributo que pueda necesitar como su atributo de clase.

Espero que esto ayude.

0

Tuve exactamente el mismo problema con el campo validado correctamente en TextBoxFor pero no en DropDownListFor.

@Html.DropDownListFor(m => m.PaymentTO.CreditCardType, Model.CreditCardTypeList, "Select Card Type", new { style = "width:150px;" }) 

Como no tenía otra DropDownListFor trabajando en la misma página, sabía que no era un problema DropDownListFor genérico. También tengo un modelo complejo y el objeto principal PaymentTO no se inicializó. Cuando configuro viewTO.PaymentTO = new PaymentTO(); en el Controlador, la validación de DropDownListFor comenzó a funcionar. Entonces, probablemente haya un problema con DropDownListFor, pero la solución puede ser tan simple como inicializar el objeto en el controlador.

2

Esta es la manera más sencilla que encontré para hacerlo, simplemente agregando atributos data-val-*-* en HtmlAttributes de DropDownListFor, dentro de la vista. El siguiente método funciona con RemoteValidation también, si usted no necesita la validación remoto, basta con quitar los elementos que contienen data-val-remote-*:

 @Html.DropDownListFor(m => m.yourlistID, (IEnumerable<SelectListItem>)ViewBag.YourListID, String.Empty, 
     new Dictionary<string, object>() { { "data-val", "true" }, 
     { "data-val-remote-url", "/Validation/yourremoteval" }, 
     { "data-val-remote-type", "POST" }, { "data-val-remote-additionalfield", "youradditionalfieldtovalidate" } }) 

espero que pueda ayudar. ¡Atentamente!

Cuestiones relacionadas