Saya memiliki aplikasi lokal, dan saya bertanya-tanya apakah mungkin untuk memiliki DisplayName
properti model tertentu yang ditetapkan dari Sumber Daya.
Saya ingin melakukan sesuatu seperti ini:
public class MyModel {
[Required]
[DisplayName(Resources.Resources.labelForName)]
public string name{ get; set; }
}
Tapi saya tidak bisa melakukannya, seperti kata kompiler: "Argumen atribut harus berupa ekspresi konstan, ekspresi typeof atau ekspresi penciptaan array tipe parameter atribut" :(
Apakah ada solusi? Saya mengeluarkan label secara manual, tetapi saya membutuhkan ini untuk keluaran validator!
c#
asp.net-mvc
localization
resources
resx
Palantir
sumber
sumber
Jika Anda menggunakan MVC 3 dan .NET 4, Anda bisa menggunakan
Display
atribut baru diSystem.ComponentModel.DataAnnotations
namespace. Atribut ini menggantikanDisplayName
atribut dan menyediakan lebih banyak fungsi, termasuk dukungan lokalisasi.Dalam kasus Anda, Anda akan menggunakannya seperti ini:
Sebagai catatan tambahan, atribut ini tidak akan berfungsi dengan sumber daya di dalam
App_GlobalResources
atauApp_LocalResources
. Ini ada hubungannya dengan alat kustom (GlobalResourceProxyGenerator
) penggunaan sumber daya ini. Alih-alih pastikan file sumber daya Anda disetel ke 'Sumber daya tertanam' dan gunakan alat kustom 'ResXFileCodeGenerator'.(Sebagai catatan tambahan, Anda tidak boleh menggunakan
App_GlobalResources
atau menggunakanApp_LocalResources
MVC. Anda dapat membaca lebih lanjut mengapa hal ini terjadi di sini )sumber
Name = "labelForName"
Anda juga bisa menggunakanName = nameof(Resources.Resources.labelForName)
.Jika Anda membuka file sumber daya Anda dan mengubah pengubah akses ke publik atau internal itu akan menghasilkan kelas dari file sumber daya Anda yang memungkinkan Anda untuk membuat referensi sumber daya sangat diketik.
Yang berarti Anda dapat melakukan sesuatu seperti ini sebagai gantinya (menggunakan C # 6.0). Maka Anda tidak perlu mengingat apakah nama depan lebih kecil atau lebih tebal. Dan Anda dapat melihat apakah properti lain menggunakan nilai sumber daya yang sama dengan temukan semua referensi.
sumber
Memperbarui:
Saya tahu ini sudah terlambat tetapi saya ingin menambahkan pembaruan ini:
Saya menggunakan Penyedia Metadata Model Konvensional yang dihadirkan oleh Phil Haacked , lebih kuat dan mudah diterapkan lihatlah: ConventionalModelMetadataProvider
Jawaban Lama
Di sini jika Anda ingin mendukung banyak jenis sumber daya:
Kemudian gunakan seperti ini:
Untuk tutorial pelokalan lengkap, lihat halaman ini .
sumber
Saya mendapatkan jawaban Gunders dengan App_GlobalResources saya dengan memilih properti sumber daya dan beralih "Alat Kustom" ke "PublicResXFileCodeGenerator" dan membangun tindakan untuk "Sumber Daya Tertanam". Silakan perhatikan komentar Gunders di bawah ini.
Bekerja seperti pesona :)
sumber
Tentukan Nama atribut yang digunakan untuk kunci sumber daya, setelah C # 6.0, Anda dapat menggunakan
nameof
untuk dukungan mengetik yang kuat alih-alih mengkode kunci dengan keras.Atur budaya thread saat ini di controller.
Resource.Culture = CultureInfo.GetCultureInfo("zh-CN");
Atur aksesibilitas sumber daya ke publik
Tampilkan label dalam cshtml seperti ini
@Html.DisplayNameFor(model => model.Age)
sumber