Cómo usar Html.GetUnobtrusiveValidationAttributes ()

Estoy tratando de evitar el hecho de que cuando escribieron asp.net MVC 3 se olvidaron de incluir el código para agregar los atributos de validación discreta a las listas seleccionadas y su “solución” es incluirlo en MVC 4, que no es sangriento utilizar a cualquier persona utilizando MVC 3.

Mi propuesta de trabajo es usar Html.GetUnobtrusiveValidationAttributes() para agregarlos yo mismo, como cualquier otro atributo personalizado, pero no puedo calcular la syntax correcta para llamar al método. Hay 2 sobrecargas, una toma una cadena y la otra toma una cadena y una clase ModelMetaData. Entiendo el parámetro de metadatos, supongo que acabo de pasar ViewData.ModelMetadata pero ¿cuál debería ser la cadena? La documentación de MSDN dice que es “el atributo de nombre HTML especificado” lo que no tiene sentido para mí. El atributo de nombre HTML de qué? La lista de selección? ¿Por qué necesitaría eso y cómo le ayuda eso a saber para qué propiedad de mi modelo quiero la validación? Mirando ejemplos de uso, todos parecen pasar el nombre de la propiedad en mi modelo para el que quiero los atributos de validación, lo cual tiene sentido. Desafortunadamente, no puedo obtener el método para devolver nada excepto una colección vacía, no importa lo que pase.

Mi clase modelo se llama Evento y mi propiedad se llama EventTypeID. Estoy utilizando una clase de viewmodel ligeramente diferente como base para la vista porque necesito mostrar una lista de Eventos y también permitir que se ingrese un nuevo evento en la misma vista, así que tengo una clase de viewmodel simple como la siguiente:

 public class EventViewModel { public Model.Event NewEvent { get; set; } public IEnumerable Events { get; set; } } 

La lista desplegable se asigna a la propiedad como: @Html.DropDownListFor(model => model.NewEvent.EventTypeID ¿qué paso como cadena a Html.GetUnobtrusiveValidationAttributes(string) Html.GetUnobtrusiveValidationAttributes(string, ModelMetadata) Para esta propiedad. He intentado:

 Html.GetUnobtrusiveValidationAttributes("EventTypeID") Html.GetUnobtrusiveValidationAttributes("EventTypeID",ViewData.ModelMetadata) Html.GetUnobtrusiveValidationAttributes("NewEvent.EventTypeID") Html.GetUnobtrusiveValidationAttributes("NewEvent.EventTypeID",ModelMetadata) 

Todos devuelven una colección vacía.

Sé que mi modelo es correcto porque si cambio la llamada de Html.DropDownListFor a Html.TextBoxFor , la validación “simplemente funciona” sin que tenga que hacer nada más que agregar los atributos de validación a mi clase de modelo.

EDITAR:

Solo intenté desactivar la validación del lado del cliente, la validación funciona bien en el lado del servidor para todas las listas de selección.

Para aquellos que todavía están buscando una respuesta, esto funciona para mí:

 public static IDictionary UnobtrusiveValidationAttributesFor(this HtmlHelper html, Expression> propertyExpression) { var propertyName = html.NameFor(propertyExpression).ToString(); var metadata = ModelMetadata.FromLambdaExpression(propertyExpression, html.ViewData); var attributes = html.GetUnobtrusiveValidationAttributes(propertyName, metadata); return attributes; } 

Tenga en cuenta que estoy usando .Net MVC 4, no tiene el método html.NameFor en MVC 3. Sin embargo, creo que esto se puede hacer en MVC 3 con el siguiente método:

 var propertyName = ExpressionHelper.GetExpressionText(propertyExpression); 

Puedes usarlo en línea

Ejemplo para seleccionar elemento

  

Aquí hay un enlace a una respuesta que publiqué, que muestra un HtmlHelper que escribí para proporcionar una validación discreta para las listas desplegables: la validación de la lista desplegable MVC 3 no funciona para el modelo de vista compleja

ACTUALIZAR

¿Estás tratando de obtener los atributos en un HtmlHelper, o en línea en tu vista?

Suponiendo que está intentando obtener los atributos en su vista, ese es el problema.

Primero, debe comprender que ModelMetadata no representa un solo objeto disponible en todo su modelo. Más bien, representa los metadatos de un elemento en particular, ya sea su modelo o cualquier propiedad dentro del modelo. Un mejor nombre descriptivo sería ObjectMetadata , ya que ModelMetadata son los metadatos de un objeto específico, ya sea un modelo, un modelo nested o una propiedad específica.

ModelMetadata en la vista es solo los metadatos para el modelo de nivel superior. Debe obtener ModelMetadata para la propiedad a la que está vinculada la lista desplegable. Si utiliza un ayudante, entonces se le pasa el ModelMetadata correcto como una cuestión de rutina. Si usa su vista, necesita participar en algunas actividades de gimnasia para obtener el ModelMetadata correcto, vea por ejemplo mi respuesta aquí: Validación y edición de un tipo “Cambiable” / opcional en Asp.net MVC 3