Mengapa saya tidak bisa meneruskan atribut html EditorFor()
? misalnya;
<%= Html.EditorFor(model => model.Control.PeriodType,
new { disabled = "disabled", readonly = "readonly" }) %>
Saya tidak ingin menggunakan metadata
Pembaruan : Solusinya adalah memanggil ini dari tampilan:
<%=Html.EditorFor( model => model.Control.PeriodEndDate, new {Modifiable=model.Control.PeriodEndDateModifiable})%>
dan digunakan ViewData["Modifiable"]
di EditorTemplates / String.ascx kustom saya di mana saya memiliki beberapa logika tampilan yang menentukan apakah akan menambahkan atribut readonly dan / atau dinonaktifkan ke input. Objek anonim yang diteruskan ke EditorFor()
dalam parameter yang dipanggil additionalViewData
dan sifat-sifatnya dilewatkan ke template editor di ViewData
koleksi.
html
asp.net-mvc
editorfor
Typo Johnson
sumber
sumber
Jawaban:
EditorFor
berfungsi dengan metadata, jadi jika Anda ingin menambahkan atribut html Anda selalu bisa melakukannya . Pilihan lain adalah cukup menulis templat khusus dan menggunakanTextBoxFor
:sumber
PeriodType
? Bukankah ini properti sederhana? Jika itu adalah objek yang kompleks, Anda bisa menyesuaikan seluruh templat dengan menempatkan sebagian di~/Views/ControllerName/EditorTemplates/SomeType.ascx
manaSomeType
nama jenisPeriodType
properti.@class
template editor yang berisi 3 divs misalnya. Helper Html.TextBoxFor memungkinkan Anda untuk mendefinisikan ini karena Anda tahu apa yang dihasilkan helper ini - sebuah kotak teks sehingga masuk akal untuk mendefinisikan kelas ke elemen input.Pembaruan MVC 5.1 sekarang mendukung pendekatan di bawah ini secara langsung, sehingga berfungsi juga untuk editor bawaan. http://www.asp.net/mvc/overview/releases/mvc51-release-notes#new-features (Ini adalah kasus Great mind thinking atau mereka membaca jawaban saya :)
Akhiri Pembaruan
Jika Anda menggunakan template editor Anda sendiri atau dengan MVC 5.1 yang sekarang mendukung pendekatan di bawah ini langsung untuk editor bawaan.
kemudian di template Anda (tidak diperlukan untuk tipe sederhana di MVC 5.1)
sumber
Pada MVC 5.1, Anda sekarang dapat melakukan hal berikut:
http://www.asp.net/mvc/overview/releases/mvc51-release-notes#new-features
sumber
EditorFor
templat bawaan / bawaan . Jika Anda menerapkan sendiri, Anda harus mengikuti jawaban AntonK.Sekarang ASP.Net MVC 5.1 mendapat dukungan bawaan untuknya.
Dari Catatan Rilis
Sebagai contoh:
sumber
Berikut ini sintaks kode VB.Net untuk atribut html di MVC 5.1 EditorFor
sumber
Kenapa tidak pakai saja
sumber
Jika Anda tidak ingin menggunakan Metadata, Anda dapat menggunakan
[UIHint("PeriodType")]
atribut untuk menghias properti atau jika ini adalah tipe kompleks, Anda tidak perlu menghias apa pun. EditorFor kemudian akan mencari file PeriodType.aspx atau ascx di folder EditorTemplates dan menggunakannya.sumber
Saya telah bergulat dengan masalah yang sama hari ini untuk kotak centang yang mengikat bool nullable, dan karena saya tidak dapat mengubah model saya (bukan kode saya) saya harus menemukan cara yang lebih baik untuk menangani ini. Ini agak kasar, tetapi harus bekerja untuk 99% kasus yang mungkin saya temui. Anda jelas harus melakukan beberapa populasi manual dari atribut yang valid untuk setiap jenis input, tapi saya pikir saya sudah mendapatkan semuanya untuk kotak centang.
Dalam template editor Boolean.cshtml saya:
sumber
Dictionary<string,string> attribs = new Dictionary<string,string>();
danattribs.Add("tabindex","16");
di salah satu@( )
blok di bagian atas halaman saya. Kemudian saya lakukan@Html.CheckBox("IsActive", Model.IsActive.HasValue ? Model.IsActive : false, attribs)
di halaman saya dan itu memberi saya kesalahan: "'System.Web.Mvc.HtmlHelper <MyProject.Models.MyObject>' tidak mengandung definisi untuk 'Kotak Centang' dan metode ekstensi terbaik overload 'System.Web. Mvc.InputExtensions.CheckBox (System.Web.Mvc.HtmlHelper, string.bool, objek) 'memiliki beberapa argumen yang tidak valid ".Anda masih dapat menggunakan EditorFor. Cukup berikan atribut style / html mana saja sebagai ViewData.
Karena EditorFor menggunakan templat untuk merender, Anda bisa mengganti templat default untuk properti Anda dan cukup meneruskan atribut style sebagai ViewData.
Jadi EditorTemplate Anda ingin yang berikut:
sumber
Anda bisa menggunakan seperti ini; output yang sama dengan
Html.EditorFor
, dan Anda dapat menambahkan atribut html Andasumber
TextBoxFor
mengabaikan jenis apa punDisplayFormat
yang mungkin Anda coba terapkan.Cukup buat template Anda sendiri untuk jenis di Views / Shared / EditorTemplates / MyTypeEditor.vbhtml
Aktifkan editor dari tampilan Anda dengan properti model:
Maafkan sintaks VB. Itulah cara kami menggulung.
sumber
Dalam kasus saya, saya mencoba membuat template editor input angka HTML5 yang dapat menerima atribut tambahan. Pendekatan yang lebih rapi adalah menulis HTML Helper Anda sendiri, tetapi karena saya sudah memiliki template .ascx, saya menggunakan pendekatan ini:
Bit jelek ini menciptakan input tipe angka dan mencari Kamus ViewData dengan kunci "atribut". Itu akan beralih melalui kamus menambahkan pasangan kunci / nilainya sebagai atribut. Regex dalam atribut ID tidak terkait dan ada karena ketika digunakan dalam koleksi,
GetFullHtmlFieldId()
mengembalikan id yang berisi tanda kurung siku[]
yang biasanya akan dilepaskan sebagai garis bawah.Template ini kemudian disebut seperti ini:
Verbose, tetapi berhasil. Anda mungkin bisa menggunakan refleksi dalam templat untuk menggunakan nama properti sebagai nama atribut alih-alih menggunakan kamus.
sumber
Atur kondisi menggunakan
ViewData
di controllerKemudian gunakan viewdata ini dalam template editor untuk mengatur atribut html kontrol
sumber
MVC 5.1 dan solusi yang lebih tinggi (akan menggabungkan HtmlAttributes lokal dan didefinisikan dalam EditorTemplates):
Shared \ EditorTemplates \ String.cshtml:
Ekstensi:
Pemakaian:
sumber
source1
dansource2
sebagaiIDictionary<string, object>
. Saya membuat fungsi ini:private static IDictionary<string, object> ToHtmlAttributesDictionary(this IEnumerable<KeyValuePair<string, object>> dico) { return dico.ToDictionary(s => s.Key.Replace('_', '-'), s => s.Value); }