ASP.NET MVC 3: Mengganti atribut "nama" dengan TextBoxFor

99

Apakah mungkin saat menggunakan Html.TextBoxForuntuk mengganti atribut nama?

Saya telah mencoba tetapi tidak berhasil. Saya perlu menggunakan TextBoxFor agar validasi sisi klien berfungsi, namun untuk alasan yang tidak saya bahas, saya memerlukan nama kotak teks agar berbeda dari yang dibuat.

Saya telah mencoba yang berikut ini:

@Html.TextBoxFor(x => x.Data, new { name = Model.Key + "_Data", id = Model.Key + "_Data" })

Yang berfungsi untuk ID tapi bukan nama. Apakah ini mungkin?

Pembaruan : Melihat kode untuk TextBoxFor. Sepertinya tidak ada cara yang mudah. Semoga seseorang bisa membuktikan saya salah.

Rob Stevenson-Leggett
sumber
Apa jenis data 'Data'
archil
2
Pertanyaan-pertanyaan itu menanyakan sesuatu yang sedikit berbeda. Juga - ini adalah yang lebih tua dari ketiganya, jadi saya pikir maksud Anda diduplikasi oleh.
Rob Stevenson-Leggett

Jawaban:

234

Rob, sebenarnya ada cara yang lebih sederhana. Sebagai ganti nama , gunakan Nama :

@Html.TextBoxFor(x => x.Data, new { Name = Model.Key + "_Data", id = Model.Key + "_Data" })
anar khalilov
sumber
11
Peka huruf besar dan kecil @highwingers, detail kecil ini berpotensi menghemat waktu.
anar khalilov
3
Berlebihan .. Nama tapi id X_X
Vladimirs
2
Aneh, "id" tidak peka huruf besar / kecil (berfungsi dengan baik dengan Id dan id) tetapi "nama" tidak.
Vladimirs
10
Dengan ASP.NET 4, memberikan Namehasil dalam dua atribut, Namedan name, dan pengikat model menggunakan name.
GSerg
1
Tetapi menangani dua properti berbeda yang namanya berbeda hanya berdasarkan kasus adalah resep untuk mimpi buruk pemeliharaan .....
James McCormack
41

Apakah Anda menanyakan ini karena Anda ingin menerapkan awalan pada nama? Jika demikian, Anda dapat melakukan ini dengan mengatur ViewData.TemplateInfo.HtmlFieldPrefixdi Controller Anda.

Saya belajar banyak tentang hal ini dari blog Brad Wilson .

James McCormack
sumber
Ini sepertinya pemenangnya! Cantik.
Rob Stevenson-Leggett
2
Ya, mereka menyembunyikan yang itu dengan baik bukan :)
James McCormack
Ini hanya menyelamatkan saya dari sakit kepala dan duplikasi kode.
davidXYZ
13

EditorFor memiliki kelebihan beban di mana Anda dapat menyediakan nameatribut sebagai parameter:

 @Html.EditorFor(expression, null, name)
Pelindung satu
sumber
1
Akan menyelamatkan saya berjam-jam jika saya menemukan ini jam yang lalu, haha
Johnie Karr
Menarik, tetapi tidak ada kelebihan beban untuk atribut name untuk pembantu serupa seperti DropDownListFor, Anda harus menentukannya dalam parameter atribut html (dengan huruf besar N pada Name).
nmit026
8

Coba EditorFor . Anda bisa melewatkan string sebagai nama template jika Anda ingin memastikan textbox dirender meskipun tipe properti bukan string. Jika properti sudah berupa string, itu tidak perlu templatenamesecara eksplisit merender kotak teks, jadi Anda bisa lewat null. Perhatikan bahwa ini tidak memerlukan parameter id secara eksplisit, ini akan menyimpulkannya dari nama elemen. Dan semua validasi masih aktif dengan EditorFor

 @Html.EditorFor(x => x.Data, "string", Model.Key + "_Data")
archil
sumber
7

Jawaban ben memberi saya apa yang saya cari kecuali Anda harus membungkusnya dalam Html.Raw

@Html.Raw(Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData"))
Rip Ryness
sumber
4

Ini disebut Microsoft GOTCHA

Gunakan nama dengan huruf kapital, seperti ini

@Html.TextBoxFor(m => m.Reply.Answer, new {@Name="Whatyouwant"})
Ali Adravi
sumber
3

sedikit "unpretty" =), coba:

@Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData")
benwasd
sumber
Sepertinya cara mudah yang bagus untuk melakukannya. Jika sedikit hacky :-)
Rob Stevenson-Leggett
umm, begini, bukankah Anda lebih suka menggunakan Html.TexBox biasa .. karena semua pengetikan statis hilang setelah penggantian
sharp johnny
1

Bagi saya, itu berhasil! Saya berharap bantuan itu!

@Html.EditorFor(model => model.Nome, new { htmlAttributes = new { @class = "form-control", @maxlength = "80", @id = "NomeFilter", @Name = "NomeFilter" } })
Jonas
sumber
1
@Html.EditorFor(Model => Model.Something, "name", "name", new {@class = "form-control" })

Tidak yakin mana dari dua parameter string di tengah yang berfungsi, tetapi hanya berfungsi ketika saya mengetik keduanya.

Tuan Ajdos
sumber
Ini Id dan Nama. ini berhasil untuk saya. Saya memeriksa semua jawaban di atas dan tidak ada yang berhasil, tetapi ini 1. Terima kasih.
Orion
public static MvcHtmlString EditorFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string templateName, string htmlFieldName, object additionalViewData);. Tidak tahu apa templateNameyang seharusnya, jadi saya dulu null. Karena htmlFieldNamesaya menggunakan nama parameter (dalam kasus saya "ipmi" bukan "IPMI"). Itu berhasil bagi saya.
BCdotWEB
0

Untuk contoh ini, saya menonaktifkan bidang formulir berdasarkan izin, tetapi masih menampilkannya. Saya memiliki bidang tersembunyi untuk mengirim nilai ke pengontrol, tetapi menginginkan nama bidang yang berbeda di EditorFor. Parameter pertama setelah nilai model mewakili properti "name", kedua adalah nama baru.

@Html.EditorFor(m => m.UserName, "name", "UserNameDisabled", new { htmlAttributes = new { @class = "form-control", @disabled = "disabled"} });

Hasil dalam:

<input class="form-control text-box single-line" disabled="disabled" id="UserNameDisabled" name="UserNameDisabled" type="text" value="someEnteredValue" /> 
ScottLenart
sumber
0

Sederhanakan, Anda sudah memberikan ID Anda hanya harus dapat menggunakan metode "TextBox" bukan "TextBoxFor" dan itu akan bekerja dengan baik di sisi klien dan sisi server. Selain itu, meskipun jawaban yang diterima akan berfungsi tetapi akan menghasilkan atribut Nama duplikat pada tag Anda jika Anda memeriksanya menggunakan browser. Solusi di bawah ini tidak memiliki masalah itu.

MvcHtmlString Html.TextBox (nama string, nilai string, objek htmlAttributes)

@Html.TextBox(Model.Key + "_Data", Model.Key, new { id = Model.Key + "_Data" }
TroySteven
sumber