Tengo una aplicación localizada y me pregunto si es posible DisplayName
establecer la propiedad de un determinado modelo a partir de un Recurso.
Me gustaría hacer algo como esto:
public class MyModel {
[Required]
[DisplayName(Resources.Resources.labelForName)]
public string name{ get; set; }
}
Pero no puedo hacerlo, como dice el compilador: "Un argumento de atributo debe ser una expresión constante, tipo de expresión o expresión de creación de matriz de un tipo de parámetro de atributo" :(
¿Hay alguna solución? Estoy enviando etiquetas manualmente, ¡pero las necesito para la salida del validador!
c#
asp.net-mvc
localization
resources
resx
Palantir
fuente
fuente
Si usa MVC 3 y .NET 4, puede usar el nuevo
Display
atributo en elSystem.ComponentModel.DataAnnotations
espacio de nombres. Este atributo reemplaza alDisplayName
atributo y proporciona mucha más funcionalidad, incluido el soporte de localización.En su caso, lo usaría así:
Como nota al margen, este atributo no funcionará con recursos dentro
App_GlobalResources
oApp_LocalResources
. Esto tiene que ver con la herramienta personalizada (GlobalResourceProxyGenerator
) que utilizan estos recursos. En su lugar, asegúrese de que su archivo de recursos esté configurado en 'Recurso incorporado' y use la herramienta personalizada 'ResXFileCodeGenerator'.(Como nota adicional, no deberías usar
App_GlobalResources
oApp_LocalResources
con MVC. Puedes leer más sobre por qué este es el caso aquí )fuente
Name = "labelForName"
usted también puede usarName = nameof(Resources.Resources.labelForName)
.Si abre su archivo de recursos y cambia el modificador de acceso a público o interno, generará una clase a partir de su archivo de recursos que le permitirá crear referencias de recursos fuertemente tipadas.
Lo que significa que puede hacer algo como esto (usando C # 6.0). Entonces no tienes que recordar si el primer nombre estaba en minúsculas o en camello. Y puede ver si otras propiedades usan el mismo valor de recurso con buscar todas las referencias.
fuente
Actualizar:
Sé que es demasiado tarde, pero me gustaría agregar esta actualización:
Estoy usando el proveedor de metadatos de modelos convencionales que presentado por Phil Haacked es más potente y fácil de aplicar. Míralo : ConventionalModelMetadataProvider
Vieja respuesta
Aquí, si desea admitir muchos tipos de recursos:
Entonces úsalo así:
Para ver el tutorial completo de localización, consulte esta página .
fuente
Obtuve la respuesta de Gunders al trabajar con mi App_GlobalResources eligiendo las propiedades de los recursos y cambié "Herramienta personalizada" a "PublicResXFileCodeGenerator" y creé la acción a "Recursos integrados". Observe el comentario de Gunders a continuación.
Funciona de maravilla :)
fuente
Defina el nombre del atributo que se usa para la clave del recurso, después de C # 6.0, puede usarlo
nameof
para obtener un soporte de tipo seguro en lugar de codificar la clave.Establece la cultura del hilo actual en el controlador.
Resource.Culture = CultureInfo.GetCultureInfo("zh-CN");
Establecer la accesibilidad del recurso al público
Mostrar la etiqueta en cshtml como este
@Html.DisplayNameFor(model => model.Age)
fuente