2011-03-09 16 views
6

Esta pregunta se aplica a todos los proyectos realmente, sin embargo, mi entorno de demostración es una aplicación MVC3, de ahí esa etiqueta.DisplayAttribute: No es bueno para recursos en App_GlobalResources

Escribí una clase de DisplayNameAttribute -derivada para nuestros proyectos de MVC2, como tantas otras personas, así que pude localizar nombres para mostrar en los editores de MVC y mostrar plantillas. Levanté el código de localización ValidationAttribute usado para el mensaje de error para que se comportara de una manera 'estándar'.

Entonces me di cuenta de que en MVC3 tenemos la DisplayAttribute, así que obedientemente obsoleto mi clase de atributo en la versión .Net 4 de mi marco extensión MVC y cambiado las del modelo en mi proyecto actual para utilizar esto, por ejemplo:

[Display(ResourceType = typeof(Resources.MyResources), Name = "ResourceName")] 
public string ModelProperty { get; set; } 

Luego ejecutar la aplicación web y me sale un error similar al siguiente:

System.InvalidOperationException: no se puede recuperar la propiedad 'Nombre', porque la localización falló. Escriba '[Tipo de recurso aquí]' no es público o no contiene una propiedad pública de cadena estática con el nombre '[Nombre del recurso aquí]'.

Uso la localización en varios lugares, por supuesto, y en las bibliotecas de clase, dichos recursos se marcarán como públicos. En las aplicaciones web, sin embargo, usaré la carpeta App_GlobalResources porque, bueno, ¡para eso sirve!

El problema aquí es que los descriptores de acceso de recursos que se generan para archivos resx en esta carpeta son siempre generado como el acceso interno, y no hay forma de cambiarlo.

lo tanto, ya DisplayAttribute parece más que mirar para los miembros públicos (mientras que el código de localización copié de ValidationAttribute y se aplica a mi propio tipo de DisplayNameAttribute -deriving simplemente busca a miembros estáticos, ya sea con visibilidad pública o interna), parecería que DisplayAttribute está fuera de los límites de cualquier aplicación web MVC que pretenda usar App_GlobalResources para las cadenas localizadas?

Aparte del hecho de que esto es probablemente un error en DisplayAttribute, ¿Alguien más ha solucionado este problema? ¿Qué hiciste para resolverlo? ¿Debo respetar el uso de DisplayAttribute y cambiar todos mis recursos para que estén 'correctamente' integrados como en los proyectos de la biblioteca de clases, y configurarlos como públicos? ¿O debería abandonar DisplayAttribute a favor de mi otra clase que sé que funciona?

Respuesta

9

Debería poder cambiar el modificador de acceso. En el Explorador de soluciones, haga doble clic en su archivo .resx, luego, cerca de la esquina superior derecha del editor de recursos administrados, cambie Modificador de acceso desplegable de Internal a Public.

actualización

Esto podría funcionar: Making global resources public

+0

No importa mi respuesta. Me di cuenta de que el menú desplegable solo está habilitado para los recursos locales, no para los globales. Mis disculpas. –

+0

hmmm ... sí veo, ¡funciona, pero huele a truco! –

+0

Oh, sí, absolutamente. No tengo idea de por qué obligan a que los recursos globales sean internos. –

0

Usted puede optar por generar como pública ver more details here

+0

no, no puede hacerlo; puede hacerlo en archivos resx 'normales' que se compilan como recursos incrustados; pero no puede hacer esto en los archivos de recursos Asp.Net App_GlobalResource. Por alguna razón muy extraña, están arreglados en interno y tampoco puedes cambiar el espacio de nombres en el que están compilados. –

3

This post explica un poco más acerca de los problemas con el uso de App_GlobalResources o App_LocalResources en Aplicaciones MVC.

Parece que no hay ninguna razón para usar App_GlobalResources o App_Localresources en aplicaciones MVC, y es mejor no usarlas para evitar problemas como el que está experimentando. (Otro problema que puede encontrar, según el enlace anterior, es la falla de las pruebas unitarias. Esto se debe a que los recursos solo están disponibles cuando el tiempo de ejecución de ASP.NET está ejecutando su sitio web)

Cuestiones relacionadas