Tengo una aplicación localizada y me pregunto si es posible DisplayNameestablecer 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
Displayatributo en elSystem.ComponentModel.DataAnnotationsespacio de nombres. Este atributo reemplaza alDisplayNameatributo 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_GlobalResourcesoApp_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_GlobalResourcesoApp_LocalResourcescon 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
nameofpara 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