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.


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" })

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 .


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)

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")

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"))

4

Ini disebut Microsoft GOTCHA

Gunakan nama dengan huruf kapital, seperti ini

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

3

sedikit "unpretty" =), coba:

@Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData")

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" } })

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.


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" /> 

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" }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.